本章节聊聊MySQL主从复制部署,为什么聊这个话题,也是因为我负责的整个江苏省的云上迁移项目的原因,一开始我认为我们电信天翼云针对的政府企业是数据量小,停机时间长的一个迁移项目,经过13个地市调查了解到很多政府企业的web服务等应用已经上了TB级别的量级,这个其实还不是重点,很多云主机申请的带宽只有1M-5M等不同,按照我原先计划的冷备份导出或者备份与恢复方式都没有办法满足这些甲方需求,于是我就想到了主从模式,这样停机时间短,切换时间快,数据库这种主从方案都很成熟。这也是我前面写了很多迁移方式,大部分针对的是数据量不大,停机时间长的模式。今天我就对mysql主从模式聊聊部署方式:
主从复制目的:可以做数据库的实时备份,保证数据的完整性;可做读写分离,主服务器只管写,从服务器只管读,这样可以提升整体性能。
1.安装部署mysql 5.5(rpm、源码)
检查库文件是否存在,如有删除。
[root@localhost Desktop]$ rpm -qa | grep mysql
mysql-libs-5.1.52-1.el6_0.1.x86_64
[root@localhost ~]# rpm -e mysql-libs-5.1.52.x86_64 –nodeps
命令如下:
#rpm -ivh MySQL-server-5.5.30-1.el6.x86_64.rpm
#rpm -ivh MySQL-client-5.5.30-1.el6.x86_64.rpm
#rpm -ivh MySQL-devel-5.5.30-1.el6.x86_64.rpm
/usr/bin/mysql_install_db --user=mysql 初始表
#service mysql start
更改配置文件:
主 [root@server ~]# egrep "log-bin|server-id" /etc/my.cnf
server-id = 111
log-bin-index=mysql-bin.index
从 [root@server ~]# egrep "log-bin|server-id" /etc/my.cnf
log-bin=mysql-bin
server-id=222
#show variables like 'log_bin
+-----------------------+--------+
| Variable_name | Value |
+-----------------------+--------+
| log_bin | ON | # ON 为开始开启成功
+-----------------------+--------+
3.建立用于从库复制的账号rep
mysql> grant replication slave on *.* to 'rep'@'192.168.0.%' identified by 'C#ssw0rd';
Query OK, 0 rows affected (0.00 sec)
mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)
# 检查创建的rep账号:
mysql> select user,host from mysql.user;
4、备份主库,及恢复到从库
把主库现有数据备份下来,再恢复到从库,此时两个主机的数据一致。
如果事先有数据的话,这不不能忘。
在主库上加锁,使只有只读权限。
mysql> flush table with read lock;
记住就是这个点备份的。
show master status;
+------------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000006 | 750 | wuzy |
主 mysqldump -uroot -p -hlocalhost --all-databases> mysql1.bak.sql 导出 或者如果数据量比较大,直接拷贝原始数据文件比使用mysqldump更加有效,也省去了执行insert语句更新索引的开销。
解锁库:
mysql> unlock tables;
从 mysql -uroot -p </tmp/mysql1.bak.sql 导入
5、配置从库及生效
更改从属服务器用于与主服务器进行连接和通讯的参数。
mysql> CHANGE MASTER TO
MASTER_HOST='192.168.0.203',
MASTER_PORT=3306,
MASTER_USER='rep',
MASTER_PASSWORD='C#ssw0rd',
MASTER_LOG_FILE='mysql-bin.000006',
MASTER_LOG_POS=750;
mysql> start slave;
Query OK, 0 rows affected (0.01 sec)
mysql> show slave status\G
*************************** 1. row ***************************
Slave_IO_State: Connecting to master
Master_Host: 192.168.0.203
Master_User: rep
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-bin.000005
Read_Master_Log_Pos: 948
Relay_Log_File: server-relay-bin.000001
Relay_Log_Pos: 4
Relay_Master_Log_File: mysql-bin.000005
Slave_IO_Running: Connecting
Slave_SQL_Running: Yes
6.读写分离
忽略MySQL主从复制授权表同步,读写分离
[root@bogon 3306]# vim my.cnf
#添加以下四行
replicate-ignore-db = mysql
binlog-ignore-db = mysql
binlog-ignore-db = performance_schema
binlog-ignore-db = information_schema
1) 通过read-only参数防止数据写入从库的方法。
#修改配置文件。
vim my.cnf
[mysqld]
read-only
#对用户授权事不能指定有super或all privileges权限。不然没效果。
#创建账户wuzy,并刷新权限。
mysql> grant select,insert,update,delete on *.* to 'wuzy'@'localhost' identified by 'P!ssw0rd';
Query OK, 0 rows affected (0.00 sec)
mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)
2) 从库开启bin-log
vim my.cnf
log-bin = mysql-bin
log-slave-updates #表示从库记录bin-log
expire_logs_days = 7 #保留7天bin-log。