MySQL主从复制与读写分离(详细部署案例)_<property name="loadbalance">1,2< property>

先自我介绍一下,小编浙江大学毕业,去过华为、字节跳动等大厂,目前阿里P7

深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年最新Linux运维全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上运维知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

如果你需要这些资料,可以添加V获取:vip1024b (备注运维)
img

正文

3.mysql读写分离原理

常见的mysql读写分离分为两种:

一.基于程序代码内部实现:
         在代码中根据select,insert进行路由分类,这类方法也是目前生产环境应用最广泛的。优点是性能较好,因为在程序代码中实现,不需要增加额外的设备作为硬件开支;缺点是需要开发人员来实现,运维人员无从下手。

二.基于中间代理层实现

代理一般位于客户端和服务器之间,代理服务器接到客户端的请求后通过判断后转发到后端数据库,有两个代表性程序。

1.mysql-proxy。mysql-proxy为MySQL开源项目,通过其自带的lua脚本进行SQL判断,虽然是MySQL官方产品,但是mysql官方不建议将mysql-proxy用到生产环境中。

2.amoeba(变形虫)。由陈思儒开发,其曾就职于阿里巴巴。该程序用于Java语言进行开发,阿里巴巴将其用于生产环境中。它不支持事务和存储过程。

二,搭建MySQL主从复制

注:在部署环境前请先部署好三台数据库,如有初学者可以查看前面的LAMP部署的mysql部署安装部分。

1.建立时间同步,在主部署NTP,在从服务器上进行时间同步。

[root@localhost ~]# yum -y install ntp
[root@localhost ~]# vim /etc/ntp.conf 
server 127.127.1.0
fudge 127.127.1.0 startum 8

[root@localhost ~]# systemctl restart ntpd
[root@localhost ~]# systemctl enable ntpd
Created symlink from /etc/systemd/system/multi-user.target.wants/ntpd.service to /usr/lib/systemd/system/ntpd.service.

在每一台服务器上关闭firewalld或者指定端口,服务进行开放

[root@localhost ~]# systemctl stop firewalld
[root@localhost ~]# systemctl disable firewalld
Removed symlink /etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service.
Removed symlink /etc/systemd/system/basic.target.wants/firewalld.service.

在节点上进行时间同步

[root@localhost ~]# yum -y install ntpdate
[root@localhost ~]# ntpdate 192.168.2.1
 4 Sep 15:23:06 ntpdate[81050]: adjust time server 192.168.2.1 offset -0.000618 sec

2.配置MySQL master主服务器

在/etc/my.cnf中修改或者增加下面内容,重启服务。

[root@localhost ~]# vim /etc/my.cnf
server_id = 11        #指定id每一台MySQL服务器禁止相同
log_bin = master-bin        #开启master二进制文件
log-slave-updates = true    #开启slave从服务更新二进制文件


[root@localhost ~]# systemctl restart mysqld

在登录MySQL程序,给从服务器以授权。

mysql> grant replication slave on *.* to 'myslave'@'192.168.2.%' identified by '123456';
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 | Executed_Gtid_Set |
+-------------------+----------+--------------+------------------+-------------------+
| master-bin.000001 |      410 |              |                  |                   |
+-------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)

3.配置从服务器,两台节点配置相同,注意server_id不要相同。

在/etc/my.cnf中修改或者增加下面内容,重启MySQL服务器

[root@localhost ~]# vim /etc/my.cnf
server_id = 22
relay-log=relay-log-bin
relay-log-index=slave-relay-bin.index

[root@localhost ~]# systemctl restart mysqld

登录MySQL,配置同步,查看  Slave_IO_Running: Yes, Slave_SQL_Running: Yes两项是否为Yes。

[root@localhost ~]# mysql -u root -p
Enter password: 
mysql> change master to master_host='192.168.2.1',master_user='myslave',master_password='123456',master_log_file='master-bin.000001',master_log_pos=410;

Query OK, 0 rows affected, 2 warnings (0.06 sec)

mysql> start slave;
Query OK, 0 rows affected (0.00 sec)

mysql> show slave status\G;
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 192.168.2.1
                  Master_User: myslave
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: master-bin.000001
          Read_Master_Log_Pos: 410
               Relay_Log_File: relay-log-bin.000002
                Relay_Log_Pos: 284
        Relay_Master_Log_File: master-bin.000001
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes
              Replicate_Do_DB: 


4.验证主从复制效果。

在主,从服务器上登录MySQL, 在主服务器上新建数据库db_test

mysql> create database db_test;
Query OK, 1 row affected (0.00 sec)

在主,从服务器上分别查看数据库,显示数据库相同,则主从复制成功。

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| db_test            |
| mysql              |
| performance_schema |
| test               |
+--------------------+
5 rows in set (0.01 sec)


三,搭建MySQL读写分离

1.在主服务器上部署amoeba上安装Java环境

注:因为amoeba是基于jbk开发的,所以官方团建使用jdk1.5或1.6版本,高版本不建议使用。

[root@localhost ~]# chmod +x jdk-6u14-linux-x64.bin
[root@localhost ~]# ./jdk-6u14-linux-x64.bin
[root@localhost ~]# mv jdk1.6.0_14/ /usr/local/jdk1.6
[root@localhost ~]# vim /etc/profile
export  JAVA_HOME=/usr/local/jdk1.6
export CLASSPATH=$JAVA_HOME/lib:$JAVA_HOME/jre/lib
export PATH=$JAVA_HOME/lib:$JAVA_HOME/jre/bin:$PATH:$HOME/bin
export AMOEBA_HOME=/usr/local/amoeba/
export PATH=$PATH:$AMOEBA_HOME/bin
[root@localhost ~]# source /etc/profile
[root@localhost ~]# java -version
java version "1.6.0_14"
Java(TM) SE Runtime Environment (build 1.6.0_14-b08)
Java HotSpot(TM) 64-Bit Server VM (build 14.0-b16, mixed mode)

java环境已配置成功

安装并配置Amoeba软件。

[root@localhost ~]# mkdir /usr/local/amoeba
[root@localhost ~]# tar zxf /mnt/amoeba-mysql-binary-2.2.0.tar.gz -C /usr/local/amoeba/
[root@localhost ~]# chmod -R 755 /usr/local/amoeba/
[root@localhost ~]# /usr/local/amoeba/bin/amoeba
amoeba start|stop

配置Amoeba读写分离,两个slave读负载均衡。

在master,slave1,slave2中开放权限给Amoeba访问

mysql> grant all on *.* to test@'192.168.2.%' identified by '123.com';
Query OK, 0 rows affected (0.00 sec)

编辑amoeba.xml配置文件,设置客户端登录用户名和密码。

[root@localhost ~]# cd /usr/local/amoeba/
[root@localhost amoeba]# vim conf/amoeba.xml 
                        <property name="authenticator">
                                <bean class="com.meidusa.amoeba.mysql.server.MysqlClientAuthenticator">

                                        <property name="user">amoeba</property>

                                        <property name="password">123456</property>

                                        <property name="filter">
                                                <bean class="com.meidusa.amoeba.server.IPAccessController">
                                                        <property name="ipFile">${amoeba.home}/conf/access_list.conf</property>
                                                </bean>
                                        </property>
                                </bean>
                        </property>

指定写入数据库master,指定读取使用slaves组。

 <queryRouter class="com.meidusa.amoeba.mysql.parser.MysqlQueryRouter">
                <property name="ruleLoader">
                        <bean class="com.meidusa.amoeba.route.TableRuleFileLoader">
                                <property name="ruleFile">${amoeba.home}/conf/rule.xml</property>
                                <property name="functionFile">${amoeba.home}/conf/ruleFunctionMap.xml</property>
                        </bean>
                </property>
                <property name="sqlFunctionFile">${amoeba.home}/conf/functionMap.xml</property>
                <property name="LRUMapSize">1500</property>
                <property name="defaultPool">master</property>


                <property name="writePool">master</property>
                <property name="readPool">slaves</property>

                <property name="needParse">true</property>
        </queryRouter>

编辑dbServer.xml配置文件,指定刚刚授权的用户和密码,来获取信息。

[root@localhost amoeba]# vim conf/dbServers.xml 

<!-- mysql user -->
                        <property name="user">test</property>

                        <property name="password">123.com</property>

指定mysql数据库的地址,和slave组的服务器地址。

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加V获取:vip1024b (备注运维)
img

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
erty name=“password”>123.com


        指定mysql数据库的地址,和slave组的服务器地址。





**网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**

**需要这份系统化的资料的朋友,可以添加V获取:vip1024b (备注运维)**
[外链图片转存中...(img-Id4cpIHB-1713381309161)]

**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**
  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值