为什么80%的码农都做不了架构师?>>>
##优势
- 多服务器间数据实时同步
- 可实现数据读写分离或负载均衡,主数据库压力较大时将部分查询转至从数据库处理。由此减少数据库压力,增加应对并发能力
- 从库除了作为reader外,也可作为灾备适用,增加数据安全性
##准备
- ubuntu(主:14.04,从:16.04)
- mysql5.7
安装
安装数据库
在两台服务器上都装上mysql,具体可参考另外一篇博文:
https://my.oschina.net/chaon/blog/703562
配置主数据库
- 创建用于获取主数据库数据的用户,既从库访问主库时要用到的用户(我创建的是slave,密码123456)
mysql> create user slave; //创建新用户
//repl用户必须具有REPLICATION SLAVE权限,除此之外没有必要添加不必要的权限,密码为mysql。说明一下192.168.1.%,这个配置是指明repl用户所在服务器,这里%是通配符,表示192.168.1.0-192.168.1.255的Server都可以以repl用户登陆主服务器。当然你也可以指定固定Ip。
mysql> GRANT REPLICATION SLAVE ON *.* TO 'slave'@'192.168.1.%' IDENTIFIED BY '123456';
- 修改配置文件mysqld.cnf
sudo cd /etc/mysql/mysql.conf
sudo vi mysqld.cnf
将以下几行写入到[mysqld]
的下方
server-id=1
log-bin=master-bin
log-bin-index=master-bin.index
- 重启数据库
sudo service mysql restart
- 查看状态
mysql> show master status;
这里主要记住File和Position两个值,配置从库时会用到
配置从数据库
- 修改配置文件mysqld.cnf
sudo cd /etc/mysql/mysql.conf
sudo vi mysqld.cnf
将以下几行写入到[mysqld]
的下方
server-id=2
relay-log-index=slave-relay-bin.index
relay-log=slave-relay-bin
- 重启数据库
- 连接master
mysql>change master to master_host='192.168.1.105',
master_port=3306,
master_user='slave',
master_password='123456',
master_log_file='master-bin.000003',
master_log_pos=1993;
注释: change master to master_host='master所在服务器的IP', master_port=master所在服务器的端口, master_user='同步用户名', master_password='同步用户密码', //下面连个值是在master中查看状态中查出来的两个值 master_log_file='master-bin.000003', master_log_pos=1993; 4. 开始同步
mysql>start slave;
- 查看同步状态
mysql>show slave status\G;
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 192.168.1.105
Master_User: slave
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: master-bin.000003
Read_Master_Log_Pos: 3245
Relay_Log_File: slave-relay-bin.000002
Relay_Log_Pos: 1423
Relay_Master_Log_File: master-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: 3245
Relay_Log_Space: 1630
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: 1
Master_UUID: 99c5977c-0228-11e7-935e-080027258c14
Master_Info_File: /var/lib/mysql/master.info
SQL_Delay: 0
SQL_Remaining_Delay: NULL
Slave_SQL_Running_State: Slave has read all relay log; waiting for more updates
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
Replicate_Rewrite_DB:
Channel_Name:
Master_TLS_Version:
到这里就算完成了,下面测试
##测试
- master中创建一个数据库,查看slave是否同步
- master的数据库中建一张表,查看slave是否同步
- master中在表中增加数据,查看salve是否同步
- master数据增删改操作,查看slave是否同步
. . . . . .
.
.
.
.
.