数据库读多写少,主库负责写,从库负责读。一主多从,从而解决读多写少。
宕机时将选择pos最大的从库作为新的主库,其余从库继续担任自己的职责。
简单的说就是把 一个服务器上执行过的sql语句在别的服务器上也重复执行一遍。
主服务器master记录数据库操作日志到Binary log,从服务器开启i/o线程将二进制日志记录的操作同步到relay log(存在从服务器的缓存中),另外sql线程将relay log日志记录的操作在从服务器执行。
(1)需要环境
系统:CentOS
软件包:mysql-5.6.22.tar.gz
master服务器:192.168.*.*
slave服务器1:192.168.*.*
slave服务器2:192.168.*.*
(2)修改主库服务器配置
vim /etc/my.cnf
server-id=1
log-bin=master-bin
log-bin-index=ma
修改slave服务器1配置
vi /etc/my.cnf
[mysqld]
log-bin=mysql-bin #可选项,启用二进制日志,可是主库宕机后升级从库为主库时仍然需要设置,所以现在一起启用也可以
server-id=102 #必选项,服务器唯一ID
replicate-do-db=mydb #可选项,需要同步的数据库名,不写本行表示同步所有的数据库
ster -bin .index(3)重启mysql服务
service mysql restart
(4)修改slave服务器1配置
vi /etc/my.cnf
[mysqld]
log-bin=mysql-bin #可选项,启用二进制日志,可是主库宕机后升级从库为主库时仍然需要设置,所以现在一起启用也可以
server-id=102 #必选项,服务器唯一ID
replicate-do-db=mydb #可选项,需要同步的数据库名,不写本行表示同步所有的数据库
其他从库,同样的配置。
(5)重启新配置的从服务器
service mysql restart
(6)检查主从库配置效果
主库:mysql> SHOW MASTER STATUS;
应输出如下:
从库:mysql>show slave status\G;
#以下是部分结果
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event#从库状态,已连上主库
Master_Host: 192.168.1.112#master地址
Master_User: mymaster#master用户
Master_Port: 3306#master端口
Connect_Retry: 60#重试时间,默认是60秒
Master_Log_File: mysql-bin.000001#master的binlog文件名
Read_Master_Log_Pos: 1556#同步读取二进制日志的位置,大于等于Exec_Master_Log_Pos
Slave_IO_Running: Yes#必须为Yes,此线程把master段的日志写到本地
Slave_SQL_Running: Yes#必须为Yes,此线程把写到本地的日志应用于数据库
Replicate_Do_DB:#同步数据库名(如果有)
Replicate_Ignore_DB: #忽略数据库名(如果有)
Exec_Master_Log_Pos: 1556#执行同步命令的位置
Last_IO_Errno: 0#最近IO出错位置
Last_IO_Error: #最近IO出错信息
Last_SQL_Errno: 0#最近SQL出错位置
Last_SQL_Error: #最近SQL出错信息
Master_Server_Id: 112#master服务器ID
Master_Info_File: /data/mysqldb/master.info#master.info文件位置,位于该slave中
1 row in set (0.00 sec)
如果Slave_IO_Running和Slave_SQL_Running均为Yes,则slave配置完成
(7)接下来配置个数据库的关联
a、首先我们先建立一个操作主从同步的数据库用户,切换到主数据库执行:
mysql> create user repl;
mysql> GRANT REPLICATION SLAVE ON *.* TO 'repl'@'从xxx.xxx.xxx.xx' IDENTIFIED BY 'mysql';
mysql> flush privileges;
这个配置的含义就是创建了一个数据库用户repl,密码是mysql, 在从服务器使用repl这个账号和主服务器连接的时候,就赋予其REPLICATION SLAVE的权限, *.* 表面这个权限是针对主库的所有表的,其中xxx就是从服务器的ip地址。
b、进入所有从数据库后执行:
mysql> change master to master_host='主xxx.xxx.xxx.xx',master_port=3306,master_user='repl',master_password='mysql',master_log_file='master-bin.000001',master_log_pos=0;
这里面的xxx是主服务器ip,同时配置端口,repl代表访问主数据库的用户,上述步骤执行完毕后执行start slave启动配置:
mysql> start slave;
(8)主从服务器测试
在master中创建数据库,创建表,进行增删改操作都会被同步到所有slave中,这就说明配置成功啦。
假设发生了突发事件,master宕机,现在的需求是要将192.168.1.102提升为主库,另外一个为从库
步骤:
1.确保所有的relay log全部更新完毕,在每个从库上执行:
stop slave io_thread;
show processlist;
直到看到Has read all relay log,则表示从库更新都执行完毕了
2.登陆所有从库,查看master.info文件,对比选择pos最大的作为新的主库,这里我们选择192.168.1.102为新的主库
3.登陆192.168.1.102,执行stop slave;
并进入数据库目录,删除master.info和relay-log.info文件, 配置my.cnf文件,开启log-bin,如果有log-slaves-updates和read-only则要注释掉,执行reset master
4.创建用于同步的用户并授权slave,同第3.7步骤
5.登录另外一台从库,执行stop slave停止同步
6.根据第3.7步骤连接到新的主库
7.执行start slave;
8.修改新的master数据,测试slave是否同步更新