本文主要给大家介绍MySQL主从复制类型及读写分离原理,其所涉及的东西,从理论知识来获悉,有很多书籍、文献可供大家参考,从现实意义来讲,亿速云累计多年的实践经验可分享给大家。
amoeba服务器IP地址:192.168.144.160 master服务器IP地址:192.168.144.151 slave1服务器IP地址:192.168.144.163 slave2服务器IP地址:192.168.144.145 client客户端
[root@ameoba ~]# yum install ntp -y //安装时间服务器 [root@master1 ~]# vim /etc/ntp.conf ##在server下添加 server 127.127.144.0 //本地是时间源 fudge 127.127.144.0 stratum 8 //设置时间层级为8 [root@master1 ~]# systemctl start ntpd //启动时间服务 [root@master1 ~]# systemctl stop firewalld //关闭防火墙 [root@master1 ~]# setenforce 0
[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.144.151 //同步主服务器时间 29 Nov 16:58:43 ntpdate[4932]: the NTP socket is in use, exiting
[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.144.151 29 Nov 17:02:08 ntpdate[4850]: the NTP socket is in use, exiting
[root@master1 ~]# mkdir /abc //创建挂载点 [root@master1 ~]# mount.cifs //192.168.100.8/LNMP-C7 /abc/ //远程挂载 Password for root@//192.168.100.8/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 //启动MySQL Starting MySQL.. SUCCESS! [root@master1 mysql-5.5.24]# mysqladmin -u root password 'abc123' //设置密码
[root@master1 mysql-5.5.24]# vim /etc/my.cnf server-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.144.%' IDENTIFIED BY '123456'; //给从服务器提权复制权限,名为myslave密码123456对于144段网段 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)
[root@slave1 mysql-5.5.24]# vim /etc/my.cnf server-id = 22 //另外一台为23 relay-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 -pabc123 mysql> change master to master_host='192.168.144.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: Yes
[root@slave2 mysql-5.5.24]# vim /etc/my.cnf server-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 -pabc123 mysql> change master to master_host='192.168.144.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: Yes
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)
[root@amoeba ~]# systemctl stop firewalld.service //关闭防火墙 [root@amoeba ~]# setenforce 0 [root@amoeba ~]# mount.cifs //192.168.100.8/LNMP-C7 /mnt/ //挂载 Password for root@//192.168.100.8/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|stop
grant all on *.* to test@'192.168.144.%' identified by '123.com'; //给amoeba访问权限用户test密码123.com
[root@amoeba conf]# vim amoeba.xml //修改主配置文件 ---30行-- <property name="user">amoeba</property> //从服务器同步主服务器的用户密码 ----32行--------- <property name="password">123456</property> ---117-去掉注释- <property name="defaultPool">master</property> <property name="writePool">master</property> <property name="readPool">slaves</property> :wq [root@amoeba conf]# vim conf/dbServers.xml //配置数据库配置文件 --26-29--去掉注释-- <property name="user">test</property> <property name="password">123.com</property> -----42-主服务器地址--- <dbServer name="master" parent="abstractServer"> <property name="ipAddress">192.168.144.151</property> --52-从服务器主机名- <dbServer name="slave1" parent="abstractServer"> <property name="ipAddress">192.168.144.163</property> ##复制6行添加slave2 <dbServer name="slave2" parent="abstractServer"> <property name="ipAddress">192.168.144.145</property> --65行左右-- <dbServer name="slaves" virtual="true"> <poolConfig class="com.meidusa.amoeba.server.MultipleServerPool"> --末尾-- <property name="poolNames">slave1,slave2</property> </poolConfig> [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.144.160:34090 192.168.144.151:3306 ESTABLISHED 40925/java tcp6 0 0 192.168.144.160:33866 192.168.144.145:3306 ESTABLISHED 40925/java tcp6 0 0 192.168.144.160:55984 192.168.144.163:3306 ESTABLISHED 40925/java
[root@client ~]# yum install mysql -y //安装测试数据库
[root@client ~]# mysql -u amoeba -p123456 -h 192.168.144.160 -P8066 //使用amoeba账户密码登录amoeba MySQL [(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 changed MySQL [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 changed mysql> 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; //slave上没有写入 Empty set (0.00 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主从复制类型及读写分离原理,希望能给大家在实际运用中带来一定的帮助。本文由于篇幅有限,难免会有不足和需要补充的地方,大家可以继续关注亿速云行业资讯板块,会定期给大家更新行业新闻和知识,如有需要更加专业的解答,可在官网联系我们的24小时售前售后,随时帮您解答问题的。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。