背景
组里针对Mysql和MongoDB要搭建主从,提升生产应用的稳定性,同时尽量不影响性能。
mysql主从的原理可以搜索下很多介绍,配置策略同 《MongoDB高可用主从配置.md 》
采用eBay公司的“两地三中心”热备策略
注:在完成主从配置后,若要添加应用库,参考简明指南:https://forums.mysql.com/read.php?26,171776,205870
1. 创建账号,授权
mysql > grant replication slave,reload,super, on *.* to 'backup'@ ’192.168.52.220’ identified by ‘123456’;
建立一个帐户backup,并且只能允许从192.168.52.220这个地址上来登陆,密码是123456。这里@后面的ip地址就是slave的ip
注意,如上是在主服务器上操作,给将来的cong服务器权限
2. 主服务器配置
server-id=1 #为主服务器A的ID值
log-bin=mysql-bin #二进制变更日志
3. 从服务器配置
log_bin = mysql-bin
server_id= 2
relay_log = mysql-relay-bin
log_slave_updates = 1 --这个区分了是否slave
read_only= 1
4. 完成后的配置
略
技术摘要
主从复制条件
- 开启Binlog功能
- 主库要建立账号
- 从库要配置master.info (CHANGE MASTER to…相当于配置密码文件和Master的相关信息)
- start slave 开启复制功能
主从复制时需要理解
- 3个线程,主库IO,从库IO和SQL及作用
- master.info(从库)作用
- relay-log 作用
- 异步复制
- binlog作用 (如果需要级联需要开启Binlog)
主从复制时注意事项
- 主从复制是异步逻辑的SQL语句级的复制
- 复制时,主库有一个I/O线程,从库有两个线程,I/O和SQL线程
- 实现主从复制的必要条件是主库要开启记录binlog功能
- 作为复制的所有Mysql节点的server-id都不能相同
- binlog文件只记录对数据库有更改的SQL语句(来自主库内容的变更),不记录任何查询(select,show)语句
手工安装具体步骤
官方文档,二进制安装,而不是编译安装
https://dev.mysql.com/doc/refman/5.7/en/binary-installation.html
yum search libaio – (在同个目录下已经帮忙下好了 sudo rpm -ivh libaio-0.3.109-13.el7.x86_64.rpm)
注意centos已经有默认的mariadb的包,要删除,先用rpm -qa | grep mariadb查询一下
$ sudo rpm -e --nodeps mariadb-libs-5.5.60-1.el7_5.x86_64
$ rpm -aq | grep mariadb
$ sudo rpm -ivh mysql-community-common-5.7.17-1.el7.x86_64.rpm mysql-community-client-5.7.17-1.el7.x86_64.rpm mysql-community-server-5.7.17-1.el7.x86_64.rpm mysql-community-libs-5.7.17-1.el7.x86_64.rpm
warning: mysql-community-common-5.7.17-1.el7.x86_64.rpm: Header V3 DSA/SHA1 Signature, key ID 5072e1f5: NOKEY
Preparing... ################################# [100%]
Updating / installing...
1:mysql-community-common-5.7.17-1.e################################# [ 25%]
2:mysql-community-libs-5.7.17-1.el7################################# [ 50%]
3:mysql-community-client-5.7.17-1.e################################# [ 75%]
4:mysql-community-server-5.7.17-1.e################################# [100%]
如果具备条件,也可以使用docker,但是最好是tess
安装之后的设置,本文略过安装部分,直接看设置部分
-
whereis mysql --check if success
-
sudo systemctl start mysqld / sudo systemctl status mysqld (这样就随系统自启动了)
-
找到临时密码
cd /var/log -- 准备查 /var/log/mysqld.log
$ sudo su mysql
$ cat mysqld.log | grep temporary
2019-07-31T08:06:23.010669Z 1 [Note] A temporary password is generated for root@localhost: qt=e!=:P>50p
- 更改密码为XXXXXXXXXXX(填写自己设置的密码),安全设置,但是允许了远程登录
sudo mysql_secure_installation
- 登录
mysql –u root –p
grant replication slave, replication client on *.* to slave@'10.199.xxx.xxx' identified by 'XXXXXXXXXX';
grant replication slave, replication client on *.* to slave@'10.16.xxx.xxx' identified by 'XXXXXXXXXX';
准备主从
主的/etc/my.cnf要改,备的也要 (里面指明了哪些数据库要备份,跳过哪些数据库)
主的所有数据库在备上都要建立,然后倒入主库备份的tar
修改配置文件,重启数据库,检查slave线程状态
mysql> show master logs;
+---------------------+-----------+
| Log_name | File_size |
+---------------------+-----------+
| mysql-or-bin.000001 | 1538 |
| mysql-or-bin.000002 | 398 |
+---------------------+-----------+
在/etc/my.cnf配置文件中
log-bin=mysql-or-bin
replicate-do-db=huanqiu
replicate-ignore-db=mysql
slave-skip-errors=all
grant要成功,从备机ping一下主机,telnet 3306端口,然后用mysql,slave账号,看能否远程登录主机
change master to master_host='10.199.xxx.xxx',master_user='slave',master_password='XXXXXXXXXXXX',master_log_file='mysql-or-bin.000001',master_log_pos=1345;
显示slave状态
mysql> show slave status \G;
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 10.199.xxx.xxx
Master_User: slave
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-or-bin.000001
Read_Master_Log_Pos: 1056
Relay_Log_File: lvstraffictepbatch-286242-relay-bin.000002
Relay_Log_Pos: 323
Relay_Master_Log_File: mysql-or-bin.000001
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
1 row in set (0.00 sec)
当IO和SQL线程的状态均为Yes,则表示主从已实现同步了!
如何验证同步开启了
登录 主服务器 92 备服务器 140 filer机器 75,同时打开mysql
在主服务器的mysql中插入一条sql insert into huanqiu.haha1 values(201, 'myname');
然后在3个库上查询,发现每个库都已经有了这个结果
为什么要设置成主从?
好处多多,首先复习一下 设计面试:如何扩展互联网应用Scalability for dummies.md
如上6大原则,可以分为3类,
-
垂直扩展VS水平扩展
-
缓存和负载均衡
-
数据库:repliacation VS sharding
(但是eBay marketing team的特点,主要是批处理,使用了repliacation,暂不考虑分库分表)
主从的好处
-
backup,有实时备份了,数据不丢失
-
可扩展,读应用都从多个备库上走(但这个场景目前在eBay marketing team不多见,在网易圈圈多见)
如果配置为主主模式,还有更进一步的好处:
- 灾备和高可用,生产上主挂了,备用的自动升级为主,不影响生产 (主从模式下是不能自动切换的,因为主从同步是主服务器binlog是数据源头,如果主挂了,没有源头了,从服务器的数据更新是不会和主服务器同步的。)