球球看世界

Mysql 主从同步和读写分离

andy.zhang 2017年04月28日 Linux 530 评论关闭

环境:虚拟机这里做了四个,其实,用三个来做也是可以,主库和读写分离软件在一起。

192.168.1.160    amoeba   #读写分离软件

192.168.1.161    mysql_master  主库,用来写

192.168.1.162    mysql_s1     从库1,负责读

192.168.1.163    mysql_s2     从库2,负责读

1,主从,同步

     分别在161,162,163上装好mysql,这里省略安装过程。需要的,请百度一下。

     在161上,修改my.cnf文件,添加如下内容

        server-id=1

        log-bin=zxq                                    #同步的标示符,二进制文件名,可以自义

        log-slave-updates

        sync_binlog=1

        auto-increment-increment=2        

        auto-increment-offset=1                #这是用来区分服务器的,每台服务器设置不同。

        slave-skip-errors=all

        到mysql里添加一个用来同步的用户,命令如下:

       GRANT REPLICATION SLAVE ON *.* to 'mysync'@'%' identified by 'q123456'

        说明:以mysync为用户名的所有主机都能访问,实际中,hosts必须要指定,要是阿里云的

        服务器,请多指定几个同步用户,用来同步不同的机器。用户名可以一样,hosts不同。密码

        也相同,这样操作比较方便些。当然,密码可以设置复杂一些。这里顺便说一下mysql这个帐号

        的安全问题,有人说,你密码设置得这么简单,很容易猜,但你想想,就算你猜中了密码,也是没

        有登录权限的。因为,你不是在那个hosts(IP)下。所以,这根本不存在安全问题。

   在162,163上都是以下操作,不同之处是server-id,auto-increment-offset这两个设置

        server-id=2                        #如有新服务器,请设置不一样的

        log-bin=zxq

        log-slave-updates

        sync_binlog=1

        auto-increment-increment=2

        auto-increment-offset=2            #如有新服务器,请设置不一样的。

        slave-skip-errors=all

     这时,三台服务器都重启一下mysql服务

        /etc/init.d/mysqld restart

   在161上,show master status;(如下图)

1.png

注:由于用来贴图的服务器,已重启过几次,所以file那里,会显示zxq.000005这个文件,

正常应该是zxq.000001这个。由于没有指定binlog_do_db,所以,所有的DB都会进行同步。


在162,163上,

    stop slave;

    reset slave;

    change master to master_host='192.168.1.161',

                                 master_user='mysync',

                                 maste_password='q123456';

没有报错,就成功了。手工开启一下同步

    start slave;

检查同步有没有问题

     show slave status \G

注意,这里使用“\G”,令输出内容更好看些。在输出内容找到如下

            Slave_IO_Running: Yes

            Slave_SQL_Running: Yes

只要这两个为"Yes",说明,同步成功了。做到这里,可以说,成功把主从同步做好。


2,读写分离

     这里使用阿里云的开源项目变形虫。(以后,看有机会用mycat做一次)

    a)搭建jdk环境

         到oracle下,把jdk软件下载下来,再用rpm安装一下即可

         rpm -ivh jdk-8u131-linux-x64.rpm

         修改一下环境变量

         vim /etc/profile

          新增

          JAVA_HOME=/usr/java/jdk1.8.0_131   #注意,版本不同,目录名不同

          PATH=$PATH:JAVA_HOME/bin:/usr/local/amoeba/bin    #这里,顺便把amoeba的路径指定了一下

          export JAVA_HOME PATH

          source /etc/profile

          下载amoeba,现在最新版是3.0.5

           wget https://svwh.dl.sourceforge.net/project/amoeba/Amoeba%20for%20mysql/3.x/amoeba-mysql-3.0.5-RC-distribution.zip

           unzip -x amoeba-mysql-3.0.5-RC-distribution.zip

           mv amoeba-mysql-3.0.5-RC /usr/local/amoeba

           cd /usr/local/amoeba

          首先,设置conf/dbServer.xml中连接的库名及帐号密码,找到以下代码段,注意,红色部份

<dbServer name="abstractServer" abstractive="true">

                <factoryConfig class="com.meidusa.amoeba.mysql.net.MysqlServerConnectionFactory">

                        <property name="connectionManager">${defaultManager}</property>

                        <property name="sendBufferSize">64</property>

                        <property name="receiveBufferSize">128</property>


                        <!-- mysql port -->

                        <property name="port">3306</property>


                        <!-- mysql schema -->

                        <property name="schema">ibos</property>


                        <!-- mysql user -->

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


                        <property name="password">123!@#qwe</property>

                </factoryConfig>

          以上四处红色标记分别表示:mysql端口,数据库名,数据库使用用户,对应用户的密码

          接着,找以下代码段:

 </dbServer>

        <dbServer name="Master"  parent="abstractServer">

                <factoryConfig>

                        <!-- mysql ip -->

                        <property name="ipAddress">192.168.1.161</property>

                </factoryConfig>

        </dbServer>


        <dbServer name="server1"  parent="abstractServer">

                <factoryConfig>

                        <!-- mysql ip -->

                        <property name="ipAddress">192.168.1.162</property>

                </factoryConfig>

        </dbServer>


        <dbServer name="server2"  parent="abstractServer">

                <factoryConfig>

                        <!-- mysql ip -->

                        <property name="ipAddress">192.168.1.163</property>

                </factoryConfig>

        </dbServer>


        <dbServer name="VirtualPool" virtual="true">

                <poolConfig class="com.meidusa.amoeba.server.MultipleServerPool">

                        <!-- Load balancing strategy: 1=ROUNDROBIN , 2=WEIGHTBASED , 3=HA-->

                        <property name="loadbalance">1</property>


                        <!-- Separated by commas,such as: server1,server2,server1 -->

                        <property name="poolNames">server1,server2</property>

                </poolConfig>

        </dbServer>

这里,要注意,配置文件里默认的dbServer name这一段,只有两个,分别是含server1,server2的,

那段Master是我复制出来的。全标红色。下面的,有IP,也有名称,要注意VirtualPool,不要错了。下面配置文件会用到。

之后,就是修改amoeba.xml

 <property name="port">8066</property>


                        <!-- bind ipAddress -->

                        <!-- 

                        <property name="ipAddress">127.0.0.1</property>

                         -->


                        <property name="connectionFactory">

                                <bean class="com.meidusa.amoeba.mysql.net.MysqlClientConnectionFactory">

                                        <property name="sendBufferSize">128</property>

                                        <property name="receiveBufferSize">64</property>

                                </bean>

                        </property>


                        <property name="authenticateProvider">

                                <bean class="com.meidusa.amoeba.mysql.server.MysqlClientAuthenticator">


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


                                        <property name="password">123!@#qwe</property>


                                        <property name="filter">

以上代码块,红色部份分别表示:服务端口(改成3306也可以),数据库访问用户(程序调用),密码。

<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">multiPool</property>


                <property name="defaultPool">Master</property>

                <property name="writePool">Master</property>

                <property name="readPool">VirtualPool</property>


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

        </queryRouter>

这里,只注意这个代码段就可以了。(默认配置文件里是注释了的,而且,只有两行)

这里,定义了读,写的地址池,和上一个配置文件对应。

修改一下jvm.properties,在后面添加如下代码:

JVM_OPTIONS="-server -Xms1024m -Xmx1024m -Xss256k -XX:PermSize=16m -XX:MaxPermSize=96m"

至此,amoeba基本配置完成,可以启动看。

/usr/local/amoeba/bin/launcher &


一般,没有报错,就证明可以用了。至于,测试,请自行百度完成,这里就不分享。









发表评论

必填

选填

选填

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

球球看世界

我的微信号:zxq138888888 (左侧二维码扫一扫)欢迎添加!

nginx对ipv6的支持