mysql5.6.43主从+mycat读写分离

一、编译mysql5.6.43

两台机器 都部署mysql
1.47 master
1.48 slave

1、 安装依赖

 yum -y install make gcc-c++ cmake bison-devel  ncurses-devel perl vim

准备用户和组

 groupadd mysql  
 useradd mysql -g mysql -M -s /sbin/nologin 

mkdir /usr/local/mysql  安装目录
mkdir /usr/local/mysql/data  存放数据目录

2、安装mysql-5.6.43.tar.gz

wget https://dev.mysql.com/get/Downloads/MySQL-5.6/mysql-5.6.43.tar.gz
tar zxf MySQL-5.6/mysql-5.6.43.tar.gz
cd mysql-5.6.43
#开始编译
cmake -DCMAKE_INSTALL_PREFIX=/usr/local/mysql -DMYSQL_DATADIR=/usr/local/mysql/data -DSYSCONFDIR=/etc -DWITH_MYISAM_STORAGE_ENGINE=1 -DWITH_INNOBASE_STORAGE_ENGINE=1 -DWITH_MEMORY_STORAGE_ENGINE=1 -DWITH_READLINE=1 -DMYSQL_UNIX_ADDR=/tmp/mysqld.sock -DMYSQL_TCP_PORT=3306 -DENABLED_LOCAL_INFILE=1 -DWITH_PARTITION_STORAGE_ENGINE=1 -DEXTRA_CHARSETS=all -DDEFAULT_CHARSET=utf8 -DDEFAULT_COLLATION=utf8_general_ci

#开始安装
make;make install

#目录授权

chown mysql:mysql /usr/local/mysql

3、数据库初始化

 cd /usr/local/mysql
 ./scripts/mysql_install_db --user=mysql --datadir=/usr/local/mysql/data

4、配置

cp support-files/my-default.cnf  /etc/my.cnf 
 
 #修改my.cnf配置
vim /etc/my.cnf
    
[mysqld] 添加:
datadir=/usr/local/mysql/data
lower_case_table_names=1
 
#设置环境变量
[root@localhost ~]# vi /root/.bash_profile
在修改PATH=$PATH:$HOME/bin为:
 PATH=$PATH:$HOME/bin:/usr/local/mysql/bin:/usr/local/mysql/lib
 [root@localhost ~]# source /root/.bash_profile //使刚才的修改生效

5、启动
5.1 传统启动

mysqld_safe --user=mysql --skip-grant-tables --skip-networking &
mysql -u root -p(回车)
mysql> use mysql;
mysql> desc user;
mysql> GRANT ALL PRIVILEGES ON *.* TO root@"%" IDENTIFIED BY "root";    //为root添加远程连接的能力
mysql> update user set Password = password('123456') where User='root';    //设置root用户密码

5.2 服务启动

 cp /usr/local/mysql/support-files/mysql.server /etc/init.d/mysql  
 相关命令:
 service mysql start  
 #停止mysql服务  
 service mysql stop  
 #重启mysql服务  
 service mysql restart  
  
 #添加到开机启动项
 chkconfig --add mysql
  
 #修改root密码(前提是mysql启动成功)
 cd /usr/local/mysql 
 #./bin/mysqladmin -u root password 

至此部署完毕

二、主从同步

1.47 master
1.48 slave

master配置

在Linux环境下MySQL的配置文件的位置是在 /etc/my.cnf ,在该文件下指定Master的配置如下:

    log-bin=mysql-bin
    server-id=2 唯一标识
    binlog-ignore-db=information_schema
    binlog-ignore-db=cluster
    binlog-ignore-db=mysql
    binlog-do-db=ufind_db 指定需要同步的数据库

然后重启mysql:service mysqld restart
赋予从库权限帐号,允许用户在主库上读取日志,赋予10.255.1.48也就是Slave机器有File权限,只赋予Slave机器有File权限还不行,还要给它REPLICATION SLAVE的权限才可以。

mysql> GRANT FILE ON *.* TO 'root'@'10.255.1.48' IDENTIFIED BY '123456';
mysql> GRANT REPLICATION SLAVE ON *.* TO 'root'@'10.255.1.48' IDENTIFIED BY '123456';
mysql> flush privileges;	

重启mysql,登录mysql,显示主库信息

mysql> show master status;
+------------------+----------+--------------+----------------------------------+-------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB                 | Executed_Gtid_Set |
+------------------+----------+--------------+----------------------------------+-------------------+
| mysql-bin.000001 |      602 | ufind_db     | information_schema,cluster,mysql |                   |
+------------------+----------+--------------+----------------------------------+-------------------+

这里的 File 、Position 是在配置Salve的时候要使用到的,Binlog_Do_DB表示要同步的数据库,Binlog_Ignore_DB 表示Ignore的数据库,这些都是在配置的时候进行指定的。

另外:如果执行这个步骤始终为Empty set(0.00 sec),那说明前面的my.cnf没配置对。

slave配置

从库的配置,首先也是修改配置文件:/etc/my.cnf 如下:

log-bin=mysql-bin
server-id=3
binlog-ignore-db=information_schema
binlog-ignore-db=cluster
binlog-ignore-db=mysql
replicate-do-db=ufind_db
replicate-ignore-db=mysql
log-slave-updates
slave-skip-errors=all
slave-net-timeout=60

在5.6以及后续版本的配置如下:

修改完/etc/my.cnf 文件之后,重启一下MySQL(service mysql restart)

mysql> stop slave;
mysql> change master to master_host='10.255.1.47',master_user='root',master_password='123456',master_log_file='mysql-bin.000001',mysql> stop slave; master_log_pos=602;
mysql> start slave;

在这里指定Master的信息,master_log_file是在配置Master的时候的File选项, master_log_pos是在配置Master的Position 选项,这里要进行对应。

然后可以通过mysql> show slave status; 查看配置的信息:

mysql> show slave status \G;
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 10.255.1.47
                  Master_User: root
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: mysql-bin.000001
          Read_Master_Log_Pos: 602
               Relay_Log_File: fht48-relay-bin.000002
                Relay_Log_Pos: 283
        Relay_Master_Log_File: mysql-bin.000001
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes
              Replicate_Do_DB: ufind_db
          Replicate_Ignore_DB: mysql
           Replicate_Do_Table: 
       Replicate_Ignore_Table: 
      Replicate_Wild_Do_Table: 
  Replicate_Wild_Ignore_Table: 
                   Last_Errno: 0
                   Last_Error: 
                 Skip_Counter: 0
          Exec_Master_Log_Pos: 602
              Relay_Log_Space: 456
              Until_Condition: None
               Until_Log_File: 
                Until_Log_Pos: 0
           Master_SSL_Allowed: No
           Master_SSL_CA_File: 
           Master_SSL_CA_Path: 
              Master_SSL_Cert: 
            Master_SSL_Cipher: 
               Master_SSL_Key: 
        Seconds_Behind_Master: 0
Master_SSL_Verify_Server_Cert: No
                Last_IO_Errno: 0
                Last_IO_Error: 
               Last_SQL_Errno: 0
               Last_SQL_Error: 
  Replicate_Ignore_Server_Ids: 
             Master_Server_Id: 2
                  Master_UUID: fc6f0b5c-5c21-11e9-bba3-005056a1e18d
             Master_Info_File: /usr/local/mysql/data/master.info
                    SQL_Delay: 0
          SQL_Remaining_Delay: NULL
      Slave_SQL_Running_State: Slave has read all relay log; waiting for the slave I/O thread to update it
           Master_Retry_Count: 86400
                  Master_Bind: 
      Last_IO_Error_Timestamp: 
     Last_SQL_Error_Timestamp: 
               Master_SSL_Crl: 
           Master_SSL_Crlpath: 
           Retrieved_Gtid_Set: 
            Executed_Gtid_Set: 
                Auto_Position: 0
1 row in set (0.00 sec)

ERROR: 
No query specified

可以看到,配置成功


添加需要同步的库

由于种种原因,测试的时候使用test库,这里我按照上述的方式,修改Master的my.cnf的配置文件,新增同步的数据库test,重启MySQL,执行Master的:show master status如下:

mysql> show master status;
+------------------+----------+---------------+----------------------------------+-------------------+
| File             | Position | Binlog_Do_DB  | Binlog_Ignore_DB                 | Executed_Gtid_Set |
+------------------+----------+---------------+----------------------------------+-------------------+
| mysql-bin.000002 |      120 | ufind_db,test | information_schema,cluster,mysql |                   |
+------------------+----------+---------------+----------------------------------+-------------------+

相应的,要修改Slave从库的信息在my.cnf 增加 replicate-do-db=test,重启Mysql,根据上述的show master status,在Slave从库中执行下边的内容:

mysql> stop slave;
mysql> change master to master_host=‘10.255.1.47’,master_user=‘root’,master_password=‘123456’,master_log_file=‘mysql-bin.000002’,master_log_pos=120;
mysql> start slave;

然后使用:show slave status;

mysql>  show slave status\G;
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 10.255.1.47
                  Master_User: root
                  Master_Port: 3306
                Connect_Retry: 60
              Master_Log_File: mysql-bin.000002
          Read_Master_Log_Pos: 120
               Relay_Log_File: fht48-relay-bin.000002
                Relay_Log_Pos: 283
        Relay_Master_Log_File: mysql-bin.000002
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes
              Replicate_Do_DB: ufind_db,test
          Replicate_Ignore_DB: mysql
           Replicate_Do_Table: 
       Replicate_Ignore_Table: 
      Replicate_Wild_Do_Table: 
  Replicate_Wild_Ignore_Table: 
                   Last_Errno: 0
                   Last_Error: 
                 Skip_Counter: 0
          Exec_Master_Log_Pos: 120
              Relay_Log_Space: 456
              Until_Condition: None
               Until_Log_File: 
                Until_Log_Pos: 0
           Master_SSL_Allowed: No
           Master_SSL_CA_File: 
           Master_SSL_CA_Path: 
              Master_SSL_Cert: 
            Master_SSL_Cipher: 
               Master_SSL_Key: 
        Seconds_Behind_Master: 0
Master_SSL_Verify_Server_Cert: No
                Last_IO_Errno: 0
                Last_IO_Error: 
               Last_SQL_Errno: 0
               Last_SQL_Error: 
  Replicate_Ignore_Server_Ids: 
             Master_Server_Id: 2
                  Master_UUID: fc6f0b5c-5c21-11e9-bba3-005056a1e18d
             Master_Info_File: /usr/local/mysql/data/master.info
                    SQL_Delay: 0
          SQL_Remaining_Delay: NULL
      Slave_SQL_Running_State: Slave has read all relay log; waiting for the slave I/O thread to update it
           Master_Retry_Count: 86400
                  Master_Bind: 
      Last_IO_Error_Timestamp: 
     Last_SQL_Error_Timestamp: 
               Master_SSL_Crl: 
           Master_SSL_Crlpath: 
           Retrieved_Gtid_Set: 
            Executed_Gtid_Set: 
                Auto_Position: 0
1 row in set (0.01 sec)

ERROR: 
No query specified

三、半同步复制

mysql主从复制是基于binlog的复制方式,而mysql默认的主从复制方式,其实是异步复制.
主库实际上并不关心从库是否把数据拉完没有,也不关心从库有没有把数据写进硬盘入库,反正数据丢过去,让从库自己慢慢跑,而实际上这也并不影响主库任何使用的情况.

细心的人就会发现,这种情况下,假如主库临时挂了,binlog还没传输完毕,即使是集群也不能保证说这挂了之后的数据一致性,因为你不能排除别人在主库是正常提交的,而从库没有数据的情况.

然后在某个位面的时间上,就有人提出同步复制的概念,意思就是说,只要从库没写入,主库就不返回完成,这个时候即使主库挂了,这也只是一个未完成的事务,从库也不会记录,能保证数据一致性.

看上去,数据一致性是解决了,但是呢,每个事务的延时就增大了,如果是大事务的话,就更惨,这得看网络带宽能不能顶得住,不然延时更低,性能更差.

最后,在mysql5.5之后,半同步就提出来了,意思就是说,每个事务的复制,至少保证一个从库已经收到了binlog,主库才返回事务完成,但不需要理会从库是否写入硬盘.

这样做虽然延时还是有,但是比起完全的同步方式还是好太多,对于数据一致性要求高的情况,牺牲性能来换取一定的价值,是在所难免的.

第一部,客户端提交sql语句,

第二部,提交给存储引擎解析并处理数据修改,

第三部,事务在主库处理完毕,处于待完成状态,等待最终完成,

第四部,同时提交给各从库,等待完成,

第五部,从库返回状态给主库,标记已完成,半同步只需要一个从库返回就可以,其他会转成异步

第六部,返回客户端,整个事务已完成.

下面来看看如何安装使用半同步,大部分mysql本身并没有预装半同步的组件,需要另外安装,但是一般mysql的包里面会自带so文件,所以只要手动加载一下就可以用了.

先检查下有没有装

#查找是否有semisync字母,有就是装了,没有就是没装,默认是不安装的,所以请看下一步
mysql> show plugins;

然后我们开始准备安装的事情:

#查找mysql插件目录位置
mysql> show variables like 'plugin_dir';
+---------------+------------------------------+
| Variable_name | Value                        |
+---------------+------------------------------+
| plugin_dir    | /usr/local/mysql/lib/plugin/ |
+---------------+------------------------------+

去看一下相关文件夹:

#查看目录文件是否存在

[root@fht47 ~]# ll  /usr/local/mysql/lib/plugin/
总用量 1892
-rwxr-xr-x. 1 root root  15800 4月  11 12:14 adt_null.so
-rwxr-xr-x. 1 root root  29328 4月  11 13:58 auth.so
-rwxr-xr-x. 1 root root  13728 4月  11 12:14 auth_socket.so
-rwxr-xr-x. 1 root root  28400 4月  11 13:58 auth_test_plugin.so
-rwxr-xr-x. 1 root root 694752 4月  11 13:58 connection_control.so
-rw-r--r--. 1 root root    227 12月 21 15:46 daemon_example.ini
drwxr-xr-x. 2 root root      6 4月  11 14:08 debug
-rwxr-xr-x. 1 root root  39712 4月  11 13:58 libdaemon_example.so
-rwxr-xr-x. 1 root root  20872 4月  11 12:14 mypluglib.so
-rwxr-xr-x. 1 root root  13096 4月  11 13:58 mysql_no_login.so
-rwxr-xr-x. 1 root root  19168 4月  11 13:58 qa_auth_client.so
-rwxr-xr-x. 1 root root  27832 4月  11 13:58 qa_auth_interface.so
-rwxr-xr-x. 1 root root  14288 4月  11 13:58 qa_auth_server.so
-rwxr-xr-x. 1 root root 515288 4月  11 13:58 semisync_master.so
-rwxr-xr-x. 1 root root 275896 4月  11 13:58 semisync_slave.so
-rwxr-xr-x. 1 root root  14560 4月  11 13:58 test_udf_services.so
-rwxr-xr-x. 1 root root 183912 4月  11 13:58 validate_password.so

看到下面两个,就是半同步的组件了,一个是主库组件,一个是从库组件,你可以两个都装上或者只装一个.

semisync_master.so
semisync_slave.so

下面开始正式安装:

#在主库上执行
mysql> install plugin rpl_semi_sync_master soname 'semisync_master.so';
mysql> show plugins;
#看到下面这个就证明成功了
rpl_semi_sync_master | ACTIVE | REPLICATION | semisync_master.so | GPL

从库当然也要做

#然后在从库执行
mysql> install plugin rpl_semi_sync_slave soname 'semisync_slave.so';
mysql> show plugins;
#看到下面这个就证明成功了
rpl_semi_sync_slave  | ACTIVE | REPLICATION | semisync_slave.so  | GPL

安装完了,就开始准备启动了,

主库很简单,只要设置一下半同步启动就可以了.

mysql> set global rpl_semi_sync_master_enabled = on;

当然,你也可以写到配置文件,不过写到配置文件要重启才生效,而且还要重新加载组件,所以这就没意思了.

然后到从库,slave要重启动IO线程来生效,否则还是异步的方式复制数据

mysql> set global rpl_semi_sync_slave_enabled = on;
mysql> stop slave IO_THREAD;
mysql> start slave IO_THREAD;

同样你也能写到配置文件,我就不多说了,反正这就启动完毕了.

下面来验证一下是否成功,以下是主库的信息,因为从库很多信息是没有的.

mysql> show status like '%Rpl_semi_sync%';
+--------------------------------------------+-------+
| Variable_name                              | Value |
+--------------------------------------------+-------+
| Rpl_semi_sync_master_clients               | 1     |
| Rpl_semi_sync_master_net_avg_wait_time     | 0     |
| Rpl_semi_sync_master_net_wait_time         | 0     |
| Rpl_semi_sync_master_net_waits             | 0     |
| Rpl_semi_sync_master_no_times              | 0     |
| Rpl_semi_sync_master_no_tx                 | 0     |
| Rpl_semi_sync_master_status                | ON    |
| Rpl_semi_sync_master_timefunc_failures     | 0     |
| Rpl_semi_sync_master_tx_avg_wait_time      | 0     |
| Rpl_semi_sync_master_tx_wait_time          | 0     |
| Rpl_semi_sync_master_tx_waits              | 0     |
| Rpl_semi_sync_master_wait_pos_backtraverse | 0     |
| Rpl_semi_sync_master_wait_sessions         | 0     |
| Rpl_semi_sync_master_yes_tx                | 0     |
| Rpl_semi_sync_slave_status                 | OFF   |
+--------------------------------------------+-------+
15 rows in set (0.00 sec)

解释几个重要的值。

Rpl_semi_sync_master_status: 是否启用了半同步(有时候可能网络超时导致切换成异步)。

Rpl_semi_sync_master_clients: 半同步模式下Slave一共有多少个。

Rpl_semi_sync_master_no_tx: 往slave发送失败的事务数量(最好不要有)。

Rpl_semi_sync_master_yes_tx: 往slave发送成功的事务数量。

看完上面的解析,大概你也知道我这个状态是正常的了.其他延时类别的,大家得看实际情况.

来看看我们能设置些什么关于半同步的参数

mysql> show variables like '%Rpl%';
+------------------------------------+----------+
| Variable_name                      | Value    |
+------------------------------------+----------+
| rpl_semi_sync_master_enabled       | ON       |
| rpl_semi_sync_master_timeout       | 10000    |
| rpl_semi_sync_master_trace_level   | 32       |
| rpl_semi_sync_master_wait_no_slave | ON       |
| rpl_semi_sync_slave_enabled        | OFF      |
| rpl_semi_sync_slave_trace_level    | 32       |
| rpl_stop_slave_timeout             | 31536000 |
+------------------------------------+----------+
7 rows in set (0.01 sec)

也来看看解析:

rpl_semi_sync_master_enabled: 显示是否已开启半同步机制

rpl_semi_sync_master_timeout: Master等待slave响应的时间,单位是毫秒,默认值是10秒,超过这个时间,slave无响应,将自动转换为异步复制,如果探测到从库恢复后,又从新进入半同步状态

rpl_semi_sync_master_trace_level: 监控等级,一共4个等级(1,16,32,64)。

            * 1:general 等级,如:记录时间函数失效

            * 16:detail 等级,记录更加详细的信息
            * 32:net wait等级,记录包含有关网络等待的更多信息 
            * 64:function等级,记录包含有关function进入和退出的更多信息

rpl_semi_sync_master_wait_no_slave: 是否允许master 每个事物提交后都要等待slave的receipt信号。默认为on ,每一个事务都会等待,如果slave当掉后,当slave追赶上master的日志时,可以自动的切换为半同步方式,如果为off,则slave追赶上后,也不会采用半同步的方式复制了,需要手工配置。

毫无疑问,这些参数都能通过配置文件或直接set来更改,只要你觉得这个适合你的需求,例如一般我们会把响应时间设成1秒.

最后,我们来看看同样的命令在从库会有些什么信息

mysql> show status like '%Rpl_semi_sync%';
+--------------------------------------------+-------+
| Variable_name                              | Value |
+--------------------------------------------+-------+
| Rpl_semi_sync_master_clients               | 0     |
| Rpl_semi_sync_master_net_avg_wait_time     | 0     |
| Rpl_semi_sync_master_net_wait_time         | 0     |
| Rpl_semi_sync_master_net_waits             | 0     |
| Rpl_semi_sync_master_no_times              | 0     |
| Rpl_semi_sync_master_no_tx                 | 0     |
| Rpl_semi_sync_master_status                | OFF   |
| Rpl_semi_sync_master_timefunc_failures     | 0     |
| Rpl_semi_sync_master_tx_avg_wait_time      | 0     |
| Rpl_semi_sync_master_tx_wait_time          | 0     |
| Rpl_semi_sync_master_tx_waits              | 0     |
| Rpl_semi_sync_master_wait_pos_backtraverse | 0     |
| Rpl_semi_sync_master_wait_sessions         | 0     |
| Rpl_semi_sync_master_yes_tx                | 0     |
| Rpl_semi_sync_slave_status                 | ON    |
+--------------------------------------------+-------+
15 rows in set (0.00 sec)

也正如我刚才说的,很多信息基本上没有,只有最后一行是不一样的,也只是证明从库半同步正常连接中.

再看看这个

mysql>  show variables like '%Rpl%';
+------------------------------------+----------+
| Variable_name                      | Value    |
+------------------------------------+----------+
| rpl_semi_sync_master_enabled       | OFF      |
| rpl_semi_sync_master_timeout       | 10000    |
| rpl_semi_sync_master_trace_level   | 32       |
| rpl_semi_sync_master_wait_no_slave | ON       |
| rpl_semi_sync_slave_enabled        | ON       |
| rpl_semi_sync_slave_trace_level    | 32       |
| rpl_stop_slave_timeout             | 31536000 |
+------------------------------------+----------+
7 rows in set (0.00 sec)

主要就最后两行:

rpl_semi_sync_slave_enabled: 是否开启了从库半同步
rpl_semi_sync_slave_trace_level: 监控等级,默认也是32

rpl_stop_slave_timeout: 控制stop slave 的执行时间,在重放一个大的事务的时候,突然执行stop slave ,命令 stop slave会执行很久,这个时候可能产生死锁或阻塞,严重影响性能,可以通过这个参数控制stop slave 的执行时间,一般不需要修改.

问题总结

5.7.3新加了一个半同步参数,至少有N个slave接收到日志,然后返回ack,这个半同步事务才能提交,默认是1。当这个值设置到和从库数量相等的话,则效果会等同于全同步复制。

#例如我有3个从库,我现在要设置两个从库应答才能返回事务提交成功
rpl_semi_sync_master_wait_for_slave_count = 2

5.7新功能,在控制半同步模式下 主库在返回给会话事务成功之前提交事务的方式。旧模式是AFTER_COMMIT,新模式是AFTER_SYNC,默认值:AFTER_SYNC 。master 将每个事务写入binlog ,传递到slave,并且刷新到磁盘。master等待slave 反馈接收到事务并刷新到磁盘。一旦接到slave反馈,master在主库提交事务并且返回结果给会话。 在AFTER_SYNC模式下,所有的客户端在同一时刻查看已经提交的数据。假如发生主库crash,所有在主库上已经提交的事务已经同步到slave并记录到relay log。此时切换到从库,可以保障最小的数据损失。

#显然新模式更好,不过5.7默认就是这个参数,可改可不改
rpl_semi_sync_master_wait_point = AFTER_SYNC

而当半同步复制设置N个slave应答,如果当前Slave小于N,取决于rpl_semi_sync_master_wait_no_slave的设置。

#设成0会立刻变成异步复制。
rpl_semi_sync_master_wait_no_slave = 0
#设成1仍然等待应答,直到超时。
rpl_semi_sync_master_wait_no_slave = 1

超时时间rpl_semi_sync_master_timeout的值,不应该短过应用(例如JDBC)连接池或线程池的超时时间,这样应用可能出现一直等待或者是抛出异常的问题。

#例如某些大数据量的操作,随时都超过5分钟,那么我们就要设大一点
set global rpl_semi_sync_master_timeout = 300000

四、mycat读写分离

在MySQL中间件出现之前,对于MySQL主从集群,如果要实现其读写分离,一般是在程序端实现,这样就带来一个问题,即数据库和程序的耦合度太高,如果我数据库的地址发生改变了,那么我程序端也要进行相应的修改,如果数据库不小心挂掉了,则同时也意味着程序的不可用,而这对很多应用来说,并不能接受。

引入MySQL中间件能很好的对程序端和数据库进行解耦,这样,程序端只需关注数据库中间件的地址,而无需知晓底层数据库是如何提供服务。

作为当前炙手可热的MySQL中间件,MyCAT实现MySQL主从集群的读写分离自是应有之义,其配置也相当简单。

1、部署
mycat基于java开发,需要有jdk环境

java -version
java version "1.8.0_45"
Java(TM) SE Runtime Environment (build 1.8.0_45-b14)
Java HotSpot(TM) 64-Bit Server VM (build 25.45-b02, mixed mode)


wget http://dl.mycat.io/1.6-RELEASE/Mycat-server-1.6-RELEASE-20161028204710-linux.tar.gz
tar zxf Mycat-server-1.6-RELEASE-20161028204710-linux.tar.gz
mv mycat/ /usr/local/
cd /usr/local/mycat/
bin/mycat start

netstat -tnpl|grep java
tcp        0      0 127.0.0.1:32000         0.0.0.0:*               LISTEN      18240/java          
tcp6       0      0 :::9066                 :::*                    LISTEN      18240/java          
tcp6       0      0 :::44207                :::*                    LISTEN      18240/java          
tcp6       0      0 :::8080                 :::*                    LISTEN      17701/java          
tcp6       0      0 :::43126                :::*                    LISTEN      18240/java          
tcp6       0      0 :::1984                 :::*                    LISTEN      18240/java          
tcp6       0      0 :::8066                 :::*                    LISTEN      18240/java          
tcp6       0      0 127.0.0.1:8005          :::*                    LISTEN      17701/java          
tcp6       0      0 :::8009                 :::*                    LISTEN      17701/java  
9066、8066是mycat的端口

还未完结

参考https://www.cnblogs.com/paul8339/p/8177683.html

你可能感兴趣的:(mysql)