MySQL主从复制类型、过程和读写分离
发表于:2025-12-02 作者:千家信息网编辑
千家信息网最后更新 2025年12月02日,下文给大家带来MySQL主从复制类型、过程和读写分离,希望能够给大家在实际运用中带来一定的帮助,MYSQL涉及的东西比较多,理论也不多,网上有很多书籍,今天我们就用在行业内累计的经验来做一个解答。My
千家信息网最后更新 2025年12月02日MySQL主从复制类型、过程和读写分离
下文给大家带来MySQL主从复制类型、过程和读写分离,希望能够给大家在实际运用中带来一定的帮助,MYSQL涉及的东西比较多,理论也不多,网上有很多书籍,今天我们就用在行业内累计的经验来做一个解答。
MySQL主从复制的类型
基于语句的复制(默认)在主云服务器上执行的语句,从服务器执行同样的语句基于行的复制把改变的内容复制到从服务器混合类型的复制一旦发现基于语句无法精确复制时,就会采用基于行的复制主从复制的工作过程
MySQL读写分离原理
读写分离就是只在主服务器上写,只在从服务器上读主数据库处理事务性查询,从而数据库处理select查询数据库复制被用来把事务性查询导致的变更同步到集群中的从数据库
实验环境
amoeba服务器(192.168.13.160)master服务器(192.168.13.151)slave1服务器 (192.168.13.163)slave2服务器 (192.168.13.145)client客户端1,在master服务器上安装ntp时间服务器
[root@ameoba ~]# yum install ntp -y ##安装时间服务器[root@master1 ~]# vim /etc/ntp.conf ##在server下添加server 127.127.13.0 ##本地是时间源fudge 127.127.13.0 stratum 8 ##设置时间层级为8[root@master1 ~]# systemctl start ntpd ##启动时间服务[root@master1 ~]# systemctl stop firewalld ##关闭防火墙[root@master1 ~]# setenforce 02,在slave1上安装ntp,ntpdate服务
[root@slave1 ~]# yum install ntp ntpdate -y[root@slave1 ~]# systemctl start ntpd[root@slave1 ~]# systemctl stop firewalld[root@slave1 ~]# setenforce 0[root@slave1 ~]# /usr/sbin/ntpdate 192.168.13.151 ##同步主服务器时间29 Nov 16:58:43 ntpdate[4932]: the NTP socket is in use, exiting3,在slave2上安装ntp,ntpdate服务
[root@slave2 ~]# yum install ntp ntpdate -y[root@slave2 ~]# systemctl start ntpd[root@slave2 ~]# systemctl stop firewalld[root@slave2 ~]# setenforce 0[root@slave2 ~]# /usr/sbin/ntpdate 192.168.13.15129 Nov 17:02:08 ntpdate[4850]: the NTP socket is in use, exiting4,在master,slave1,slave2上分别安装MySQL-5.5.24
[root@master1 ~]# mkdir /abc ##创建挂载点[root@master1 ~]# mount.cifs //192.168.100.3/LNMP-C7 /abc/ ##远程挂载Password for root@//192.168.100.3/LNMP-C7: [root@master1 ~]# cd /abc/[root@master1 abc]# lsmysql-5.5.24[root@master1 abc]# tar zxvf mysql-5.5.24.tar.gz -C /opt/ ##解压[root@master1 opt]# yum install -y \> gcc gcc-c++ \> ncurses \> ncurese-devel \ ##控制终端屏幕显示的库> bison \ ##语法分析> make> cmake ##cmake工具> libaio-devel ##系统调用来实现异步IO[root@slave1 opt]# useradd -s /sbin/nologin mysql ##添加不可登录的mysql用户[root@slave1 opt]# cd /opt/mysql-5.5.24/[root@slave1 mysql-5.5.24]# mkdir /usr/local/mysql ##创建安装目录[root@slave1 mysql-5.5.24]# cmake \ ##配置> -DCMAKE_INSTALL_PREFIX=/usr/local/mysql \ ##安装路径> -DMYSQL_UNIX_ADDR=/home/mysql/mysql.sock \ ##sock文件路径> -DDEFAULT_CHARSET=utf8 \ ##字符集> -DDEFAULT_COLLATION=utf8_general_ci \> -DWITH_EXTRA_CHARSETS=all \> -DWITH_MYISAM_STORAGE_ENGINE=1 \ ##存储引擎> -DWITH_INNOBASE_STORAGE_ENGINE=1 \> -DWITH_MEMORY_STORAGE_ENGINE=1 \> -DWITH_READLINE=1 \> -DENABLED_LOCAL_INFILE=1 \> -DMYSQL_DATADIR=/home/mysql \ ##数据文件路径> -DMYSQL_USER=mysql \ ##用户> -DMYSQL_TCP_PORT=3306 ##端口[root@slave1 mysql-5.5.24]# make && make install ##编译及安装[root@master1 mysql-5.5.24]# chown -R mysql.mysql /usr/local/mysql ##设置mysql属主属组[root@master1 mysql-5.5.24]# vim /etc/profile ##配置环境变量便于系统识别export PATH=$PATH:/usr/local/mysql/bin/[root@master1 mysql-5.5.24]# source /etc/profile ##刷新配置文件[root@master1 mysql-5.5.24]# cp support-files/my-medium.cnf /etc/my.cnf ##主配置文件cp:是否覆盖"/etc/my.cnf"? yes[root@master1 mysql-5.5.24]# cp support-files/mysql.server /etc/init.d/mysqld ##启动文件[root@master1 mysql-5.5.24]# chmod 755 /etc/init.d/mysqld ##设置权限[root@master1 mysql-5.5.24]# chkconfig --add /etc/init.d/mysqld ##添加到service管理中[root@master1 mysql-5.5.24]# chkconfig mysqld --level 35 on ##开机自启动[root@master1 mysql-5.5.24]# /usr/local/mysql/scripts/mysql_install_db \ ##初始化数据库> --user=mysql \> --ldata=/var/lib/mysql \> --basedir=/usr/local/mysql \> --datadir=/home/mysql[root@master1 mysql-5.5.24]# vim /etc/init.d/mysqld ##编辑启动脚本文件basedir=/usr/local/mysql ##找到此处添加路径datadir=/home/mysql[root@master1 mysql-5.5.24]# service mysqld start ##启动MySQLStarting MySQL.. SUCCESS! [root@master1 mysql-5.5.24]# mysqladmin -u root password 'abc123' ##设置密码5,配置master主服务器
[root@master1 mysql-5.5.24]# vim /etc/my.cnfserver-id = 11 ##服务ID号log-bin=master-bin ##主服务器日志文件log-slave-updates=true ##从服务器更新二进制日志[root@master1 mysql-5.5.24]# service mysqld restart ##重启MySQL服务Shutting down MySQL. SUCCESS! Starting MySQL.. SUCCESS![root@master1 ~]# mysql -uroot -pabc123 ##进入数据库mysql> GRANT REPLICATION SLAVE ON *.* TO 'myslave'@'192.168.13.%' IDENTIFIED BY '123456';##给从服务器提权复制权限,名为myslave密码123456对于13段网段Query OK, 0 rows affected (0.01 sec)mysql> FLUSH PRIVILEGES; ##刷新提权Query OK, 0 rows affected (0.00 sec)mysql> show master status; ##查看主服务器状态+-------------------+----------+--------------+------------------+| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |+-------------------+----------+--------------+------------------+| master-bin.000002 | 338 | | |+-------------------+----------+--------------+------------------+1 row in set (0.00 sec)6,配置slave1从服务器
[root@slave1 mysql-5.5.24]# vim /etc/my.cnfserver-id = 22 ##另外一台为23relay-log=relay-log-bin ##从主服务器上同步日志文件记录到本地relay-log-index=slave-relay-bin.index ##定义relay-log的位置和名称[root@slave1 mysql-5.5.24]# service mysqld restart ##重新服务Shutting down MySQL. SUCCESS! Starting MySQL.. SUCCESS![root@slave1 mysql-5.5.24]# mysql -uroot -pabc123mysql> change master to master_host='192.168.13.151',master_user='myslave',master_password='123456',master_log_file='master-bin.000002',master_log_pos=338;##同步主服务器二进制文件和位置使用授权的账号密码Query OK, 0 rows affected (0.00 sec)mysql> start slave; ##开启同步Query OK, 0 rows affected (0.01 sec)mysql> show slave status\G; ##查看状态 Master_Log_File: master-bin.000002 Read_Master_Log_Pos: 338 Relay_Log_File: relay-log-bin.000001 Relay_Log_Pos: 4 Relay_Master_Log_File: master-bin.000002 Slave_IO_Running: Yes Slave_SQL_Running: Yes7,配置slave2从服务器
[root@slave2 mysql-5.5.24]# vim /etc/my.cnfserver-id = 23 relay-log=relay-log-bin ##从主服务器上同步日志文件记录到本地relay-log-index=slave-relay-bin.index ##定义relay-log的位置和名称[root@slave2 mysql-5.5.24]# service mysqld restart ##重新服务Shutting down MySQL. SUCCESS! Starting MySQL.. SUCCESS![root@slave2 mysql-5.5.24]# mysql -uroot -pabc123mysql> change master to master_host='192.168.13.151',master_user='myslave',master_password='123456',master_log_file='master-bin.000002',master_log_pos=338;##同步主服务器二进制文件和位置使用授权的账号密码Query OK, 0 rows affected (0.00 sec)mysql> start slave; ##开启同步Query OK, 0 rows affected (0.01 sec)mysql> show slave status\G; ##查看状态 Master_Log_File: master-bin.000002 Read_Master_Log_Pos: 338 Relay_Log_File: relay-log-bin.000001 Relay_Log_Pos: 4 Relay_Master_Log_File: master-bin.000002 Slave_IO_Running: Yes Slave_SQL_Running: Yes8,测试同步情况
mysql> create database school; ##创建school数据库Query OK, 1 row affected (0.00 sec)mysql> show databases; ##查看数据库+--------------------+| Database |+--------------------+| information_schema || #mysql50#.mozilla || mysql || performance_schema || school || test |+--------------------+6 rows in set (0.01 sec)mysql> show databases; ##查看数据库+--------------------+| Database |+--------------------+| information_schema || #mysql50#.mozilla || mysql || performance_schema || school || test |+--------------------+6 rows in set (0.01 sec)实现主从同步
9,配置amoeba服务器
[root@amoeba ~]# systemctl stop firewalld.service ##关闭防火墙[root@amoeba ~]# setenforce 0[root@amoeba ~]# mount.cifs //192.168.100.3/LNMP-C7 /mnt/ ##挂载Password for root@//192.168.100.3/LNMP-C7: [root@amoeba ~]# cd /mnt/[root@amoeba mnt]# ls[root@amoeba mnt]# cp jdk-6u14-linux-x64.bin /usr/local/ ##复制jdk二进制文件到/usr/local下[root@amoeba mnt]# cd /usr/local/[root@amoeba local]# ./jdk-6u14-linux-x64.bin ##直接执行安装Do you agree to the above license terms? [yes or no]yes ##选择yes进行安装Press Enter to continue.....##回车继续[root@amoeba local]# mv jdk1.6.0_14/ /usr/local/jdk1.6 ##简化文件名[root@amoeba local]# vim /etc/profile ##设置环境变量##末行插入export JAVA_HOME=/usr/local/jdk1.6 ##家目录export CLASSPATH=$CLASSPATH:$JAVA_HOME/lib:$JAVA_HOME/jre/lib ##class环境变量export PATH=$JAVA_HOME/lib:$JAVA_HOME/jre/bin/:$PATH:$HOME/bin ##环境变量export AMOEBA_HOME=/usr/local/amoeba ##amoeba家目录export PATH=$PATH:$AMOEBA_HOME/bin ##环境变量[root@amoeba local]# source /etc/profile ##刷新配置文件[root@amoeba local]# mkdir /usr/local/amoeba ##创建amoeba目录[root@amoeba local]# cd /mnt/[root@amoeba mnt]# tar zxvf amoeba-mysql-binary-2.2.0.tar.gz -C /usr/local/amoeba ##解压amoeba[root@amoeba mnt]# chmod -R 755 /usr/local/amoeba/ ##设置权限[root@amoeba mnt]# /usr/local/amoeba/bin/amoeba ##检查是否安装成功amoeba start|stop10,在master,slave1,slave2上提权amoeba访问权限
grant all on *.* to test@'192.168.13.%' identified by '123.com';##给amoeba访问权限用户test密码123.com11,回到amoeba服务器修改配置文件
[root@amoeba conf]# vim amoeba.xml ##修改主配置文件---30行-- amoeba ##从服务器同步主服务器的用户密码----32行--------- 123456 ---117-去掉注释- master master slaves [root@amoeba conf]# vim conf/dbServers.xml ##配置数据库配置文件--26-29--去掉注释-- test 123.com -----42-主服务器地址--- 192.168.13.151 --52-从服务器主机名- 192.168.13.163 ##复制6行添加slave2 192.168.13.145 --65行左右-- --末尾--slave1,slave2 [root@amoeba conf]# /usr/local/amoeba/bin/amoeba start& ##开启amoeba服务[root@amoeba ~]# netstat -anpt | grep java ##开启另一个终端查看开启情况tcp6 0 0 127.0.0.1:26268 :::* LISTEN 40925/java tcp6 0 0 :::8066 :::* LISTEN 40925/java tcp6 0 0 192.168.13.160:34090 192.168.13.151:3306 ESTABLISHED 40925/java tcp6 0 0 192.168.13.160:33866 192.168.13.145:3306 ESTABLISHED 40925/java tcp6 0 0 192.168.13.160:55984 192.168.13.163:3306 ESTABLISHED 40925/java 12,在客户端测试读写分离
[root@client ~]# yum install mysql -y ##安装测试数据库[root@client ~]# mysql -u amoeba -p123456 -h 192.168.13.160 -P8066 ##使用amoeba账户密码登录amoebaMySQL [(none)]> show databases; ##查看数据库+--------------------+| Database |+--------------------+| information_schema || #mysql50#.mozilla || mysql || performance_schema || school || test |+--------------------+6 rows in set (0.00 sec)MySQL [(none)]> use school; ##使用数据库Database changedMySQL [school]> create table info ( ##创建表 -> id int(4) not null primary key, -> name varchar(10) not null, -> score decimal(4,1) not null);Query OK, 0 rows affected (0.02 sec)mysql> use school; ##使用数据库Database changedmysql> show tables; ##查看表+------------------+| Tables_in_school |+------------------+| info |+------------------+1 row in set (0.00 sec)mysql> stop slave;Query OK, 0 rows affected (0.01 sec)MySQL [school]> insert into info (id,name,score) values (1,'zhangsan',88); ##插入数据内容Query OK, 1 row affected (0.03 sec)mysql> select * from info;+----+----------+-------+| id | name | score |+----+----------+-------+| 1 | zhangsan | 88.0 |+----+----------+-------+1 row in set (0.00 sec)mysql> select * from info; ##从服务器上没有写入Empty set (0.00 sec)MySQL [school]> select * from info; ##没有查看到写入的内容Empty set (0.01 sec)mysql> insert into info (id,name,score) values (2,'lisi',70);Query OK, 1 row affected (0.00 sec)mysql> insert into info (id,name,score) values (3,'wuwang',60);Query OK, 1 row affected (0.00 sec)MySQL [school]> select * from info;+----+--------+-------+| id | name | score |+----+--------+-------+| 3 | wuwang | 60.0 |+----+--------+-------+1 row in set (0.00 sec)MySQL [school]> select * from info;+----+------+-------+| id | name | score |+----+------+-------+| 2 | lisi | 70.0 |+----+------+-------+1 row in set (0.00 sec)
看了以上关于MySQL主从复制类型、过程和读写分离,如果大家还有什么地方需要了解的可以在行业资讯里查找自己感兴趣的或者找我们的专业技术工程师解答的,技术工程师在行业内拥有十几年的经验了。
服务
服务器
文件
数据
数据库
配置
同步
密码
时间
环境
主从
变量
权限
类型
二进制
位置
日志
用户
目录
语句
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
网络安全法趣味动漫
萤石云服务器无法识别到硬盘
常用dns服务器
战地服务器vip
机顶盒显示服务器连接
网络技术费如何做会计分录
怎么提高数据库的检索性能
网络安全2c市场
上海众游网络技术有限公司
我们作为大学生怎样注意网络安全
mc服务器生存模式可以用指令吗
软件开发公司的科目设置
买一个服务器要多少钱
小学生网络安全家庭短剧
古剑奇谭服务器1和2
复古服务器登录不了
软件开发目标和任务
企业网络技术实务
临沂智慧养老软件开发电话
永恒之塔目前有几个服务器
用jdbc数据库连接
oracle数据库备份及导入
网络安全资产调研
mssql数据库 多实例
景安网络技术论坛
软件开发文档排版书籍
知网引文数据库
成都昌萃艳软件开发工作室
九江云服务器要多少钱
修改数据库编码的基本语法