MYSQL主从同步是目前使用比较广泛的数据库架构,技术比较成熟,配置也不复杂,特别是对于负载比较大的网站,主从同步能够有效缓解数据库读写的压力。
MYSQL主从同步是在MySQL主从复制(Master-Slave Replication)基础上实现的,通过设置在Master MySQL上的binlog(使其处于打开状态),Slave MySQL上通过一个I/O线程从Master MySQL上读取binlog,然后传输到Slave MySQL的中继日志中,然后Slave MySQL的SQL线程从中继日志中读取中继日志,然后应用到Slave MySQL的数据库中。这样实现了主从数据同步功能。
1、可以作为一种备份机制,相当于热备份
2、可以用来做读写分离,均衡数据库负载
# 主要步骤:1. 安装主数据库2. 修改root账号密码,root账号远程登录3. 安装从数据库4. 修改root账号密码,root账号远程登录,密码和主数据库密码相同 5. 主数据库修改配置,添加server-id,添加bin-log文件6. 主数据库创建同步账号,指定内网ip可以访问,设定同步密码,使用从数据库连接主数据库测试连通性7. 主数据库刷新表,锁住所有的表,查看master状态,记录bin-log文件和当前的定位编号8. 使用mysqladmin备份数据库,没有数据可以忽略这一步,数据量大的情况下使用mysqldump来备份数据9. 从数据库服务器配置server-id,将备份数据导入从服务器。开启binlog等配置10. 从数据库修改配置,添加同步账户信息以及bin-log文件和当前的定位编号11. 开启同步,主数据库接触锁定。
1、2、3、4:单机安装mysql教程
cd /appmkdir mysqlcd mysql# 下载mysql的包,可以使用服务器下载,也可以本地下载,上传到服务器上去wget https://cdn.mysql.com//Downloads/MySQL-5.7/mysql-5.7.21-1.el7.x86_64.rpm-bundle.tartar -xvf mysql-5.7.21-1.el7.x86_64.rpm-bundle.tar# 查看冲突版本软件rpm -qa | grep redhat-lsb-corerpm -qa | grep postfixrpm -qa | grep mariadb# 卸载冲突版本软件rpm -ev redhat-lsb-core-4.1-27.el7.centos.1.x86_64rpm -ev postfix-2.10.1-6.el7.x86_64rpm -ev mariadb-libs-5.5.56-2.el7.x86_64# 安装依赖yum install -y net-toolsyum install -y libaio# 安装rpm,一定要按照顺序安装,遇到问题一定要查询问题,不可直接继续安装rpm -ivh mysql-community-common-5.7.21-1.el7.x86_64.rpmrpm -ivh mysql-community-libs-5.7.21-1.el7.x86_64.rpmrpm -ivh mysql-community-client-5.7.21-1.el7.x86_64.rpmrpm -ivh mysql-community-server-5.7.21-1.el7.x86_64.rpm# 启动mysqlsystemctl start mysqld# 查看初始用户密码grep password /var/log/mysqld.log# 使用mysql账户登录,修改初始化密码mysql -p# 输入查看的密码set password = password("Yingtong@2018!");# 允许root用户远程连接grant all privileges on *.* to root@‘%‘ identified by ‘Yingtong@2018!‘; flush privileges;# 修改区分大小写的配置vim /etc/my.cnf# 底部加入配置lower_case_table_names=1# 重新启动mysqlsystemctl restart mysqld# 使用客户端工具连接服务器
# 编辑,并使用:wq保存vim /etc/my.cnf# 停止mysqlsystemctl stop mysql# 启动mysqlsystemctl start mysql# 如果启动遇到问题可有可以查看mysql启动日志,以及systemctl 启动日志# mysql日志tailf /var/log/mysqld.log# 系统日志journalctl -xe
配置:/etc/my.cnf配置修改内容(主数据库)
# 添加serverid,注意必须与从数据库不相同server-id=2# 开启mysql-bin日志,使用默认数据目录:/var/lib/mysql/,使用其他目录会有问题log-bin=/var/lib/mysql/mysql-bin# 开始mysql-replay-bin日志,使用默认数据目录relay_log = /var/lib/mysql/relay-bin# 不区分大小写,项目中有些库使用大写区分,所以服务器上添加这个设定lower_case_table_names=1
主数据库:
# 登录主数据库服务器,输入密码进行登录mysql -p# 创建同步账号,ip地址为从数据库ip地址,密码自行定义GRANT REPLICATION SLAVE,RELOAD,SUPER ON *.* TO repl@‘172.16.48.131‘ IDENTIFIED BY ‘Repl@2018!‘;# 使用户生效FLUSH PRIVILEGES;
从数据库:
# 使用mysql登录mysql -urepl -h172.16.48.129 -pRepl@2018!# 测试连接情况,成功连接上,说明创建的同步账号没有问题
主数据库;
# 连接主数据库mysql -p# 锁定数据库flush tables with read lock;# 查询主数据库信息,记录bin-log文件和坐标show master status;| File | Position |+------------------+----------+| mysql-bin.000007 | 154
主数据库;
# 创建备份文件夹目录mkdir -p /app/mysqlbackup/# 备份出文件,数据量小的情况mysqldump -uroot -p‘Yingtong@2018!‘ -S /var/lib/mysql/mysql.sock --all-databases > /app/mysqlbackup/mysql_bak.$(date +%F).sql# 备份出文件,数据量大的情况mysqldump -uroot -p‘Yingtong@2018!‘ -S /var/lib/mysql/mysql.sock --all-databases | gzip > /app/mysqlbackup/mysql_bak.$(date +%F).sql.gz# 从数据库可以使用scp命令进行拷贝scp -r root@172.16.48.129:/app/mysqlbackup/mysql_bak.2018-10-21.sql /app/mysqlbackup/
导入数据库配置
# 将备份数据导入从服务器mysql -uroot -p‘Yingtong@2018!‘ -S /var/lib/mysql/mysql.sock < /app/mysqlbackup/mysql_bak.2018-10-21.sql# 修改从服务器数据库配置vim /etc/my.cnf# 重新启动数据库systemctl stop mysqldsystemctl start mysqld
配置:/etc/my.cnf配置修改内容(从数据库)
# 服务idserver-id=1# 开启mysql-binlog日志log_bin = /var/lib/mysql/mysql-bin# 开始mysql-relay日志relay_log = /var/lib/mysql/relay-bin# 设定日志的格式化binlog-format = row# 设定从库的日志更新log-slave-updates = true# 设定只读read_only = 1# 设定数据库不区分大小写lower_case_table_names = 1
# 从数据库登录mysqlmysql -p# 设定同步账号,输入前面步骤中的mysql的mysql-bin.000007,和坐标154CHANGE MASTER TOMASTER_HOST=‘172.16.48.129‘,MASTER_USER=‘repl‘,MASTER_PASSWORD=‘Repl@2018!‘,MASTER_LOG_FILE=‘mysql-bin.000007‘,MASTER_LOG_POS=154# 开启同步start slave;# 查看同步状态:其中Slave_IO_Running: YES且Slave_SQL_Running: YES即为成功同步了show slave status \G
# 主数据库mysql -p# 解除锁定unlock tables;
# 停止数据库同步stop salve;# 停止同步线程STOP SLAVE IO_THREAD