关闭
Hit
enter
to search or
ESC
to close
May I Suggest ?
#leanote #leanote blog #code #hello world
Okeeper's Blog
Home
Archives
Tags
DevOps
软件笔记
Spring
学习
JVM系列
关于我
Centos6.5 安装Mysql5.6及主从集群配置
? mysql 主从 ?
501
0
0
zhangyue
? mysql 主从 ?
# 准备 软件环境Centos 6.5、MySQL 5.6 硬件:两台虚拟机 192.168.212.16、192.168.212.17 集群节点划分: Master:192.168.212.16 Slave: 192.168.212.17 #一、安装 在两台主机上分别按照上Mysql 5.6,安装步骤一样,如下: ``` wget https://cdn.mysql.com//Downloads/MySQL-5.6/mysql-5.6.35-linux-glibc2.5-x86_64.tar.gz tar -zxvf mysql-5.6.35-linux-glibc2.5-x86_64.tar.gz mv mysql-5.6.35-linux-glibc2.5-x86_64 /usr/local/mysql cd /usr/local/mysql #添加mysql用户组及用户,修改相关目录权限: groupadd mysql useradd mysql -g mysql #授权 chown -R root . chown -R mysql data chgrp -R mysql . #安装数据库脚本: scripts/mysql_install_db --user=mysql #开机启动 cp support-files/mysql.server /etc/rc.d/init.d/mysql chmod +x /etc/rc.d/init.d/mysql chkconfig --add mysql #修改环境变量,加入mysql的命令 #vi /etc/profile 添加 echo "export PATH=$PATH:/usr/local/mysql/bin">>/etc/profile source /etc/profile ``` 注意:如果执行以上命令报如下错误: Installing MySQL system tables..../bin/mysqld: error while loading shared libraries: libaio.so.1: cannot open shared object file: No such file or directory 执行如下命令安装libaio # yum install -y libaio #二、配置 ## 1.配置Master ### 配置Master的my.cnf ``` [mysqld] log-bin=mysql-bin #启动biglog,默认是不开启binlog的 server-id=16 #保证在主从关系中唯一,便于运维一般取ip端的末段,如16 #STATEMENT/ROW/MIXED //复制的类型,mysql默认是使用STATEMENT复制类型,意思分别为基于语句复制/基于行复制/混合复制 binlog_format="STATEMENT" #auto_increment_offset = 1 //设置AUTO_INCREMENT起点,关于这个看后记4 #auto_increment_increment = 10 //设置AUTO_INCREMENT增量 ``` > **自增长的主键** 这两个用于在双主(多主循环)互相备份。 因为每台数据库服务器都可能在同一个表中插入数据,如果表有一个自动增长的主键,那么就会在多服务器上出现主键冲突。 解决这个问题的办法就是让每个数据库的自增主键不连续。 ``` auto_increment_offset = 1// 设置AUTO_INCREMENT起点 auto_increment_increment = 10//设置AUTO_INCREMENT增量 ``` > 我假设将来可能需要 10 台服务器做备份, 所以auto-increment-increment 设为10。而 auto-increment-offset=1 表示这台服务器的序号。 从1开始,不超过auto-increment-increment。 这样做之后, 我在这台服务器上插入的第一个id就是 1, 第二行的id就是 11了, 而不是2。(同理,在第二台服务器上插入的第一个id就是2, 第二行就是12, 这个后面再介绍) 这样就不会出现主键冲突了。 > 但是 > 我们显然无法预期后面业务到底会增长到个什么样,用这样的方法,很可能在以后为自己留下一个坑,例如,如果我的服务器超过10台的时候,怎么办呢?设置成200的增量? 还是弄个UUID吧,这样相对安全可扩展性好点,虽然先对比较长了。 不过如果根据实际业务需求,确实觉得没那个必要和可能,那就可以用上面的方式做。 ### 重启mysql服务 ``` service mysql restart ``` ### 登陆 mysql客户端,安装好后默认root是没有密码登陆的,密码为空即可 ``` 登陆 mysql客户端 mysql -u root -p #修改root远程登录权限并设置密码,本机登陆可以不用密码 mysql> GRANT FILE ON *.* TO 'root'@'%' IDENTIFIED BY '111111'; #新增主从复制专用用户 mysql> CREATE USER 'repl'@'%' IDENTIFIED BY '111111'; mysql> GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%'; #刷新权限 FLUSH PRIVILEGES #锁住数据库表,保证主库不在接收新的数据 FLUSH TABLES WITH READ LOCK; ``` ### 导出Master的`test`数据库 ``` mysqldump -u root -p test >/tmp/test.sql ``` > `注意:` > 备份数据库时加`--master-data=1`,可在备份文件中生成当前精确的position,备库change master to ... 时可省些事; > 也可以使用`gzip`进行文件压缩 `mysqldump -A -B --master-data=1 | gzip > /root/alldb.sql.gz ` ### 导出数据后Master数据便可以解锁了 ``` UNLOCK tables; ``` ### 查看Master的binlog位置 ``` 登陆master mysql> show master status; +------------------+----------+--------------+---------------------------------------------+-------------------+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set | +------------------+----------+--------------+---------------------------------------------+-------------------+ | mysql-bin.000001 | 918 | | information_schema,performance_schema,mysql | | +------------------+----------+--------------+---------------------------------------------+-------------------+ ``` ## 2.配置Slave 配置slave的my.cnf ``` [mysqld] #也开启binlog,可以用来做链式复制,如果只是做从库,可不开启 log-bin=mysql-bin binlog-ignore-db=information_schema binlog-ignore-db=performance_schema binlog-ignore-db=mysql #必须和其他mysql服务器不一样 server-id=17 #relay-log-index = slave-relay-bin.index #relay-log = slave-relay-bin #replicate-do-db=test #replicate-ignore-db=mysql log-slave-updates=ON ``` > server-id 必须保证每个服务器不一样。 这可能和循环同步有关。 防止进入死循环。 > replicate-do-db 可以指定需要复制的数据库, 我这里注掉了。 演示一下。 > replicate-ignore-db 复制时需要排除的数据库, 我使用了,这个。 除开系统的几个数据库之外,所有的数据库都复制。 > relay_log 中继日志的名字。 前面说到了, 复制线程需要先把远程的变化拷贝到这个中继日志中, 在执行。 > relay-log-index 中继日志索引的名字 > log-slave-updates=ON 意思是,中继日志执行之后,这些变化是否需要计入自己的binarylog。 当你的B服务器需要作为另外一个服务器的主服务器的时候需要打开。 就是双主互相备份,或者多主循环备份。 我们这里需要, 所以打开。 重启mysql服务 ``` service mysql restart ``` 导入Master库的数据 ``` #导入数据 mysql> use test mysql> source /tmp/test.sql ``` 并开启Slave线程 ``` #修改Master库的配置 mysql> change master to master_host='192.168.212.16',master_user='repl',master_password='111111',master_log_file='mysql-bin.000001',master_log_pos=918; #开启从库拉取 mysql> start slave; #查看从库状态 mysql> show slave status \G; *************************** 1. row *************************** Slave_IO_State: Waiting for master to send event Master_Host: 192.168.212.16 Master_User: repl Master_Port: 3306 Connect_Retry: 60 Master_Log_File: mysql-bin.000003 Read_Master_Log_Pos: 576 Relay_Log_File: MYSQL-TEST-7-relay-bin.000003 Relay_Log_Pos: 511 Relay_Master_Log_File: mysql-bin.000003 Slave_IO_Running: Yes Slave_SQL_Running: Yes Replicate_Do_DB: Replicate_Ignore_DB: Replicate_Do_Table: Replicate_Ignore_Table: Replicate_Wild_Do_Table: Replicate_Wild_Ignore_Table: Last_Errno: 0 Last_Error: Skip_Counter: 0 Exec_Master_Log_Pos: 576 Relay_Log_Space: 1082 Until_Condition: None Until_Log_File: Until_Log_Pos: 0 Master_SSL_Allowed: No Master_SSL_CA_File: Master_SSL_CA_Path: Master_SSL_Cert: Master_SSL_Cipher: Master_SSL_Key: Seconds_Behind_Master: 0 Master_SSL_Verify_Server_Cert: No Last_IO_Errno: 0 Last_IO_Error: Last_SQL_Errno: 0 Last_SQL_Error: Replicate_Ignore_Server_Ids: Master_Server_Id: 16 Master_UUID: 735d454a-fff2-11e6-97d8-5254005c6130 Master_Info_File: /usr/local/mysql/data/master.info SQL_Delay: 0 SQL_Remaining_Delay: NULL Slave_SQL_Running_State: Slave has read all relay log; waiting for the slave I/O thread to update it Master_Retry_Count: 86400 Master_Bind: Last_IO_Error_Timestamp: Last_SQL_Error_Timestamp: Master_SSL_Crl: Master_SSL_Crlpath: Retrieved_Gtid_Set: Executed_Gtid_Set: Auto_Position: 0 1 row in set (0.00 sec) #看到 Slave_IO_Running: Yes Slave_SQL_Running: Yes #表示主从复制配置成功,并且主从复制线程已经启动 ``` > 如果其中一个是No, 那就说明不成功。需要查看mysql的错误日志(默认在/usr/local/mysql/data/机器名称.err)。 我在第一次做的时候就遇到这个问题。有时候密码填错了, 有时候防火墙的3306没有打开。ip地址不对,等等。 都会导致失败。 ###双主互备 双主互备,意思是一台主机既是Master又是另外一台的Slave,从而两边写入数据互相同步; #三、遇到问题 1.解决`Got fatal error 1236 from master when reading data from binary log: 'Could not find first log file name in binary log index file', Error_code: 1236` ``` #登陆Slave数据库,停止slave Slave: stop slave; #切换到Master数据库刷新binlog,并查看最新的log position Master: flush logs Master: show master status; — take note of the master log file and master log position #再切换回到Slave,修改主库配置最新的复制的binlog和位置 Slave: CHANGE MASTER TO MASTER_LOG_FILE=’log-bin.00000X′, MASTER_LOG_POS=106; #启动Slave Slave: start slave; ```
觉得不错,点个赞?
Please enable JavaScript to view the
comments powered by Disqus.
comments powered by
Disqus
文章目录