文章转载自:https://blog.csdn.net/u012280685/article/details/113520692?spm=1001.2014.3001.5501

实现一个简单的读写分离

这里通过一个简单的示例实现ProxySQL的读写分离功能,算是ProxySQL的快速入门。即使是快速入门,需要配置的内容也很多,包括:后端MySQL配置、监控配置、发送SQL语句的用户、SQL语句的路由规则。所以,想要实现一个ProxySQL+MySQL,即使只实现最基本的功能,步骤也是挺多的,不过配置的逻辑都很简单。

为了演示完整的过程,这里把后端MySQL主从复制的基本配置步骤也列出来了。如了解配置过程,可跳过主从配置的部分。

注意点:slave节点需要设置read_only=1。如果后端是PXC/MGR/MariaDB Galera,则无需手动设置,因为会自动设置。

配置后端的主从复制

提供3个MySQL节点的配置文件。

  1. # 以下是Master的配置文件
  2. [mysqld]
  3. datadir=/data
  4. socket=/data/mysql.sock
  5. log-error=/data/error.log
  6. pid-file=/data/mysqld.pid
  7. server-id=110
  8. log-bin=/data/master-bin
  9. sync-binlog=1
  10. # 以下是slave1的配置文件
  11. [mysqld]
  12. datadir=/data
  13. socket=/data/mysql.sock
  14. log-error=/data/error.log
  15. pid-file=/data/mysqld.pid
  16. server-id=120
  17. relay_log=/data/relay-log
  18. read_only=1
  19. # 以下是slave2的配置文件
  20. [mysqld]
  21. datadir=/data
  22. socket=/data/mysql.sock
  23. log-error=/data/error.log
  24. pid-file=/data/mysqld.pid
  25. server-id=130
  26. relay_log=/data/relay-log
  27. read_only=1

为3个MySQL节点提供数据目录/data

  1. mkdir /data
  2. chown -R mysql.mysql /data

初始化三个MySQL节点。

  1. mysqld --initialize-insecure --user=mysql --datadir=/data

启动3个MySQL节点的mysqld服务。

  1. systemctl start mysqld

连上master,修改root密码,创建用于复制的用户repl。

  1. # 以下在master上执行
  2. mysql> alter user root@localhost identified by 'P@ssword1!';
  3. mysql> create user repl@'192.168.100.%' identified by 'P@ssword1!';
  4. mysql> grant replication slave on *.* to repl@'192.168.100.%';
  5. mysql> flush privileges;
  6. mysql> show master status;
  7. 连上两个slave,开启复制线程。
  8. # 以下在两个slave节点上都执行
  9. change master to
  10. master_host='192.168.100.22',
  11. master_user='repl',
  12. master_password='P@ssword1!',
  13. master_port=3306,
  14. master_log_file='master-bin.000001',
  15. master_log_pos=4;
  16. start slave;

如此配置之后,3个MySQL节点就保持了同步。

向ProxySQL中添加MySQL节点

首先启动ProxySQL。 (在这一步中可以先修改配置文件,然后再启动)

  1. service proxysql start

启动后会监听两个端口,默认为6032和6033。6032端口是ProxySQL的管理端口,6033是ProxySQL对外提供服务的端口。

  1. # netstat -tnlp
  2. Active Internet connections (only servers)
  3. Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
  4. tcp 0 0 0.0.0.0:6032 0.0.0.0:* LISTEN 1231/proxysql
  5. tcp 0 0 0.0.0.0:6033 0.0.0.0:* LISTEN 1231/proxysql

然后使用mysql客户端(proxysql主机上需要安装)连接到ProxySQL的管理接口(admin interface),该接口的默认管理员用户和密码都是admin。

  1. # mysql -uadmin -padmin -P6032 -h127.0.0.1 --prompt 'admin> ' # 重新设置了提示符
  2. admin> show databases;
  3. +-----+---------------+-------------------------------------+
  4. | seq | name | file |
  5. +-----+---------------+-------------------------------------+
  6. | 0 | main | |
  7. | 2 | disk | /var/lib/proxysql/proxysql.db |
  8. | 3 | stats | |
  9. | 4 | monitor | |
  10. | 5 | stats_history | /var/lib/proxysql/proxysql_stats.db |
  11. +-----+---------------+-------------------------------------+
  12. 5 rows in set (0.00 sec)

ProxySQL提供了几个库,每个库都有各自的意义。本文只是快速入门文章,不会详细介绍每个库中的每个表以及每个字段,不过在接下来的文章中,我会详细介绍到每个字段,因为每个字段都重要。

在本文,主要修改main和monitor数据库中的表。

  1. admin> show tables from main;
  2. +--------------------------------------------+
  3. | tables |
  4. +--------------------------------------------+
  5. | global_variables |
  6. | mysql_collations |
  7. | mysql_group_replication_hostgroups |
  8. | mysql_query_rules |
  9. | mysql_query_rules_fast_routing |
  10. | mysql_replication_hostgroups |
  11. | mysql_servers |
  12. | mysql_users |
  13. | proxysql_servers |
  14. | runtime_checksums_values |
  15. | runtime_global_variables |
  16. | runtime_mysql_group_replication_hostgroups |
  17. | runtime_mysql_query_rules |
  18. | runtime_mysql_query_rules_fast_routing |
  19. | runtime_mysql_replication_hostgroups |
  20. | runtime_mysql_servers |
  21. | runtime_mysql_users |
  22. | runtime_proxysql_servers |
  23. | runtime_scheduler |
  24. | scheduler |
  25. +--------------------------------------------+
  26. admin> show tables from monitor;
  27. +------------------------------------+
  28. | tables |
  29. +------------------------------------+
  30. | mysql_server_connect_log |
  31. | mysql_server_group_replication_log |
  32. | mysql_server_ping_log |
  33. | mysql_server_read_only_log |
  34. | mysql_server_replication_lag_log |
  35. +------------------------------------+

runtime_开头的是运行时的配置,这些是不能修改的。要修改ProxySQL的配置,需要修改了非runtime_表,修改后必须执行LOAD ... TO RUNTIME才能加载到RUNTIME生效,执行save ... to disk才能将配置持久化保存到磁盘。具体操作见后文。

  1. insert into mysql_servers(hostgroup_id,hostname,port) values(10,'192.168.100.22',3306);
  2. insert into mysql_servers(hostgroup_id,hostname,port) values(10,'192.168.100.23',3306);
  3. insert into mysql_servers(hostgroup_id,hostname,port) values(10,'192.168.100.24',3306);

注:上面语句中没有先切换到main库也执行成功了,因为ProxySQL内部使用的SQLite3数据库引擎,和MySQL的解析方式是不一样的。即使执行了USE main语句也是无任何效果的,但不会报错。

查看这3个节点是否插入成功,以及它们的状态。请认真读一读每个字段的名称,混个眼熟。

  1. admin> select * from mysql_servers\G
  2. *************************** 1. row ***************************
  3. hostgroup_id: 10
  4. hostname: 192.168.100.22
  5. port: 3306
  6. status: ONLINE
  7. weight: 1
  8. compression: 0
  9. max_connections: 1000
  10. max_replication_lag: 0
  11. use_ssl: 0
  12. max_latency_ms: 0
  13. comment:
  14. *************************** 2. row ***************************
  15. hostgroup_id: 10
  16. hostname: 192.168.100.23
  17. port: 3306
  18. status: ONLINE
  19. weight: 1
  20. compression: 0
  21. max_connections: 1000
  22. max_replication_lag: 0
  23. use_ssl: 0
  24. max_latency_ms: 0
  25. comment:
  26. *************************** 3. row ***************************
  27. hostgroup_id: 10
  28. hostname: 192.168.100.24
  29. port: 3306
  30. status: ONLINE
  31. weight: 1
  32. compression: 0
  33. max_connections: 1000
  34. max_replication_lag: 0
  35. use_ssl: 0
  36. max_latency_ms: 0
  37. comment:
  38. 3 rows in set (0.00 sec)

修改后,加载到RUNTIME,并保存到disk。

  1. load mysql servers to runtime;
  2. save mysql servers to disk;

监控后端MySQL节点

添加节点之后,还需要监控后端节点。对于后端是主从复制的环境来说,这是必须的,因为ProxySQL需要通过每个节点的read_only值来自动调整它们是属于读组还是写组。

首先在后端master节点上创建一个用于监控的用户名(只需在master上创建即可,因为会复制到slave上),这个用户名只需具有USAGE权限即可。如果还需要监控复制结构中slave是否严重延迟于master(先混个眼熟:这个俗语叫做"拖后腿",术语叫做"replication lag"),则还需具备replication client权限。这里直接赋予这个权限。

  1. # 在master上执行:
  2. mysql> create user monitor@'192.168.100.%' identified by 'P@ssword1!';
  3. mysql> grant replication client on *.* to monitor@'192.168.100.%';

然后回到ProxySQL上配置监控。

  1. set mysql-monitor_username='monitor';
  2. set mysql-monitor_password='P@ssword1!';

以上设置实际上是在修改global_variables表,它和下面两个语句是等价的:

  1. UPDATE global_variables SET variable_value='monitor'
  2. WHERE variable_name='mysql-monitor_username';
  3. UPDATE global_variables SET variable_value='P@ssword1!'
  4. WHERE variable_name='mysql-monitor_password';

修改后,加载到RUNTIME,并保存到disk。

  1. load mysql variables to runtime;
  2. save mysql variables to disk;

验证监控结果:ProxySQL监控模块的指标都保存在monitor库的log表中。

以下是连接是否正常的监控(对connect指标的监控):(在前面可能会有很多connect_error,这是因为没有配置监控信息时的错误,配置后如果connect_error的结果为NULL则表示正常)

  1. admin> select * from mysql_server_connect_log;
  2. +----------------+------+------------------+-------------------------+---------------+
  3. | hostname | port | time_start_us | connect_success_time_us | connect_error |
  4. +----------------+------+------------------+-------------------------+---------------+
  5. | 192.168.100.22 | 3306 | 1530968712977867 | 4174 | NULL |
  6. | 192.168.100.23 | 3306 | 1530968712988986 | 4908 | NULL |
  7. | 192.168.100.24 | 3306 | 1530968713000074 | 3044 | NULL |
  8. | 192.168.100.22 | 3306 | 1530968772978982 | 3407 | NULL |
  9. | 192.168.100.23 | 3306 | 1530968772989627 | 3404 | NULL |
  10. | 192.168.100.24 | 3306 | 1530968773000778 | 3444 | NULL |
  11. +----------------+------+------------------+-------------------------+---------------+

以下是对心跳信息的监控(对ping指标的监控):

  1. admin> select * from mysql_server_ping_log;
  2. +----------------+------+------------------+----------------------+-------------+
  3. | hostname | port | time_start_us | ping_success_time_us | ping_error |
  4. +----------------+------+------------------+----------------------+-------------+
  5. | 192.168.100.22 | 3306 | 1530968712666540 | 452 | NULL |
  6. | 192.168.100.23 | 3306 | 1530968712668779 | 458 | NULL |
  7. | 192.168.100.24 | 3306 | 1530968712671541 | 324 | NULL |
  8. | 192.168.100.22 | 3306 | 1530968722667071 | 1190 | NULL |
  9. | 192.168.100.23 | 3306 | 1530968722669574 | 1162 | NULL |
  10. | 192.168.100.24 | 3306 | 1530968722673162 | 1380 | NULL |
  11. | 192.168.100.22 | 3306 | 1530968732668840 | 1065 | NULL |
  12. | 192.168.100.23 | 3306 | 1530968732670709 | 1054 | NULL |
  13. | 192.168.100.24 | 3306 | 1530968732672703 | 1040 | NULL |
  14. +----------------+------+------------------+----------------------+-------------+

但是,read_only和replication_lag的监控日志都为空。

  1. admin> select * from mysql_server_read_only_log;
  2. Empty set (0.00 sec)
  3. admin> select * from mysql_server_replication_lag_log;
  4. Empty set (0.00 sec)

这是因为还没有对ProxySQL中的节点分组:writer_hostgroup、reader_hostgroup。设置分组信息,需要修改的是main库中的mysql_replication_hostgroups表,该表只有3个字段:第一个字段名为writer_hostgroup,第二个字段为reader_hostgroup,第三个字段为注释字段,可随意写。

例如,指定写组的id为10,读组的id为20。

  1. insert into mysql_replication_hostgroups values(10,20);

在该配置加载到RUNTIME生效之前,先查看下各mysql server所在的组。

  1. admin> select hostgroup_id,hostname,port,status,weight from mysql_servers;
  2. +--------------+----------------+------+--------+--------+
  3. | hostgroup_id | hostname | port | status | weight |
  4. +--------------+----------------+------+--------+--------+
  5. | 10 | 192.168.100.22 | 3306 | ONLINE | 1 |
  6. | 10 | 192.168.100.23 | 3306 | ONLINE | 1 |
  7. | 10 | 192.168.100.24 | 3306 | ONLINE | 1 |
  8. +--------------+----------------+------+--------+--------+

3个节点都在hostgroup_id=10的组中。

现在,将刚才mysql_replication_hostgroups表的修改加载到RUNTIME生效。

  1. load mysql servers to runtime;
  2. save mysql servers to disk;

一加载,Monitor模块就会开始监控后端的read_only值,当监控到read_only值后,就会按照read_only的值将某些节点自动移动到读/写组。

例如,此处所有节点都在id=10的写组,slave1和slave2都是slave,它们的read_only=1,这两个节点将会移动到id=20的组。如果一开始这3节点都在id=20的读组,那么移动的将是Master节点,会移动到id=10的写组。

看结果:

  1. admin> select hostgroup_id,hostname,port,status,weight from mysql_servers;
  2. +--------------+----------------+------+--------+--------+
  3. | hostgroup_id | hostname | port | status | weight |
  4. +--------------+----------------+------+--------+--------+
  5. | 10 | 192.168.100.22 | 3306 | ONLINE | 1 |
  6. | 20 | 192.168.100.23 | 3306 | ONLINE | 1 |
  7. | 20 | 192.168.100.24 | 3306 | ONLINE | 1 |
  8. +--------------+----------------+------+--------+--------+
  9. admin> select * from mysql_server_read_only_log;
  10. +----------------+------+------------------+-----------------+-----------+--------+
  11. | hostname | port | time_start_us | success_time_us | read_only | error |
  12. +----------------+------+------------------+-----------------+-----------+--------+
  13. | 192.168.100.22 | 3306 | 1530970372197917 | 8487 | 0 | NULL |
  14. | 192.168.100.23 | 3306 | 1530970372198992 | 7907 | 1 | NULL |
  15. | 192.168.100.24 | 3306 | 1530970372199835 | 8064 | 1 | NULL |
  16. | 192.168.100.22 | 3306 | 1530970373698824 | 10078 | 0 | NULL |
  17. | 192.168.100.23 | 3306 | 1530970373699825 | 9845 | 1 | NULL |
  18. | 192.168.100.24 | 3306 | 1530970373700786 | 10745 | 1 | NULL |
  19. +----------------+------+------------------+-----------------+-----------+--------+

配置mysql_users

上面的所有配置都是关于后端MySQL节点的,现在可以配置关于SQL语句的,包括:发送SQL语句的用户、SQL语句的路由规则、SQL查询的缓存、SQL语句的重写等等。

本小节是SQL请求所使用的用户配置,例如root用户。这要求我们需要先在后端MySQL节点添加好相关用户。这里以root和sqlsender两个用户名为例。

首先,在master节点上执行:(只需master执行即可,会复制给两个slave)

  1. grant all on *.* to root@'192.168.100.%' identified by 'P@ssword1!';
  2. grant all on *.* to sqlsender@'192.168.100.%' identified by 'P@ssword1!';

然后回到ProxySQL,配置mysql_users表,将刚才的两个用户添加到该表中。

  1. insert into mysql_users(username,password,default_hostgroup) values('root','P@ssword1!',10);
  2. insert into mysql_users(username,password,default_hostgroup) values('sqlsender','P@ssword1!',10);
  3. load mysql users to runtime;
  4. save mysql users to disk;

mysql_users表有不少字段,最主要的三个字段为username、password和default_hostgroup:

  • username:前端连接ProxySQL,以及ProxySQL将SQL语句路由给MySQL所使用的用户名。
  • password:用户名对应的密码。可以是明文密码,也可以是hash密码。如果想使用hash密码,可以先在某个MySQL节点上执行select password(PASSWORD),然后将加密结果复制到该字段。
  • default_hostgroup:该用户名默认的路由目标。例如,指定root用户的该字段值为10时,则使用root用户发送的SQL语句默认情况下将路由到hostgroup_id=10组中的某个节点。
  1. admin> select * from mysql_users\G
  2. *************************** 1. row ***************************
  3. username: root
  4. password: P@ssword1!
  5. active: 1 # 注意本行
  6. use_ssl: 0
  7. default_hostgroup: 10
  8. default_schema: NULL
  9. schema_locked: 0
  10. transaction_persistent: 1 # 注意本行
  11. fast_forward: 0
  12. backend: 1
  13. frontend: 1
  14. max_connections: 10000
  15. *************************** 2. row ***************************
  16. username: sqlsender
  17. password: P@ssword1!
  18. active: 1
  19. use_ssl: 0
  20. default_hostgroup: 10
  21. default_schema: NULL
  22. schema_locked: 0
  23. transaction_persistent: 1
  24. fast_forward: 0
  25. backend: 1
  26. frontend: 1
  27. max_connections: 10000

虽然本文不详细介绍mysql_users表,但上面标注了"注意本行"的两个字段必须要引起注意。

只有active=1的用户才是有效的用户。

至于transaction_persistent字段,当它的值为1时,表示事务持久化:当某连接使用该用户开启了一个事务后,那么在事务提交/回滚之前,所有的语句都路由到同一个组中,避免语句分散到不同组(更进一步的,它会自动禁用multiplexing,让同一个事务的语句从同一个连接路由出去,保证路由到同一个组的同一个节点)。在以前的版本中,默认值为0,不知道从哪个版本开始,它的默认值为1。我们期望的值为1,所以在继续下面的步骤之前,先查看下这个值,如果为0,则执行下面的语句修改为1。

  1. update mysql_users set transaction_persistent=1 where username='root';
  2. update mysql_users set transaction_persistent=1 where username='sqlsender';
  3. load mysql users to runtime;
  4. save mysql users to disk;

然后,另开一个终端,分别使用root用户和sqlsender用户测试下它们是否能路由到默认的hostgroup_id=10(它是一个写组)读、写数据。

  1. # mysql -uroot -pP@ssword1! -P6033 -h127.0.0.1 -e "select @@server_id"
  2. +-------------+
  3. | @@server_id |
  4. +-------------+
  5. | 110 |
  6. +-------------+
  7. # mysql -uroot -pP@ssword1! -P6033 -h127.0.0.1 -e "create database proxy_test"
  8. # mysql -uroot -pP@ssword1! -P6033 -h127.0.0.1 -e "show databases;"
  9. +--------------------+
  10. | Database |
  11. +--------------------+
  12. | information_schema |
  13. | mysql |
  14. | performance_schema |
  15. | proxy_test |
  16. | sys |
  17. +--------------------+
  18. # mysql -usqlsender -pP@ssword1! -P6033 -h127.0.0.1 -e '\
  19. use proxy_test;\
  20. create table t(id int);'
  21. # mysql -usqlsender -pP@ssword1! -P6033 -h127.0.0.1 -e 'show tables from proxy_test;'
  22. +-------------------------+
  23. | Tables_in_proxy_test |
  24. +-------------------------+
  25. | t |
  26. +-------------------------+

读写分离:配置路由规则

ProxySQL的路由规则非常灵活,可以基于用户、基于schema以及基于每个语句实现路由规则的定制。

本文作为入门文章,实现一个最简单的语句级路由规则,从而实现读写分离。必须注意,这只是实验,实际的路由规则绝不应该仅根据所谓的读、写操作进行分离,而是从各项指标中找出压力大、执行频繁的语句单独写规则、做缓存等等。

和查询规则有关的表有两个:mysql_query_rules和mysql_query_rules_fast_routing,后者是前者的扩展表,1.4.7之后才支持该快速路由表。本文只介绍第一个表。

插入两个规则,目的是将select语句分离到hostgroup_id=20的读组,但由于select语句中有一个特殊语句SELECT...FOR UPDATE它会申请写锁,所以应该路由到hostgroup_id=10的写组。

  1. insert into mysql_query_rules(rule_id,active,match_digest,destination_hostgroup,apply) VALUES (1,1,'^SELECT.*FOR UPDATE$',10,1),(2,1,'^SELECT',20,1);
  2. load mysql query rules to runtime;
  3. save mysql query rules to disk;

select ... for update规则的rule_id必须要小于普通的select规则的rule_id,因为ProxySQL是根据rule_id的顺序进行规则匹配的。

再来测试下,读操作是否路由给了hostgroup_id=20的读组。

  1. # mysql -uroot -pP@ssword1! -P6033 -h127.0.0.1 -e 'select @@server_id'
  2. mysql: [Warning] Using a password on the command line interface can be insecure.
  3. +-------------+
  4. | @@server_id |
  5. +-------------+
  6. | 120 |
  7. +-------------+
  8. # mysql -uroot -pP@ssword1! -P6033 -h127.0.0.1 -e 'select @@server_id'
  9. mysql: [Warning] Using a password on the command line interface can be insecure.
  10. +-------------+
  11. | @@server_id |
  12. +-------------+
  13. | 130 |
  14. +-------------+

读操作已经路由给读组,再看看写操作。这里以事务持久化进行测试。

  1. # mysql -uroot -pP@ssword1! -P6033 -h127.0.0.1 -e '\
  2. start transaction;\
  3. select @@server_id;\
  4. commit;\
  5. select @@server_id;'
  6. +-------------+
  7. | @@server_id |
  8. +-------------+
  9. | 110 |
  10. +-------------+
  11. +-------------+
  12. | @@server_id |
  13. +-------------+
  14. | 120 |
  15. +-------------+

最后,如果想查看路由的信息,可查询stats库中的stats_mysql_query_digest表。以下是该表的一个输出格式示例(和本文无关)。

  1. admin> SELECT hostgroup hg,
  2. sum_time,
  3. count_star,
  4. digest_text
  5. FROM stats_mysql_query_digest
  6. ORDER BY sum_time DESC;
  7. +----+----------+------------+-------------------------------------------------------------+
  8. | hg | sum_time | count_star | digest_text |
  9. +----+----------+------------+-------------------------------------------------------------+
  10. | 2 | 14520738 | 50041 | SELECT c FROM sbtest1 WHERE id=? |
  11. | 1 | 3142041 | 5001 | COMMIT |
  12. | 1 | 2270931 | 5001 | SELECT c FROM sbtest1 WHERE id BETWEEN ? AND ?+? ORDER BY c |
  13. | 1 | 2021320 | 5003 | SELECT c FROM sbtest1 WHERE id BETWEEN ? AND ?+? |
  14. | 1 | 1768748 | 5001 | UPDATE sbtest1 SET k=k+? WHERE id=? |
  15. | 1 | 1697175 | 5003 | SELECT SUM(K) FROM sbtest1 WHERE id BETWEEN ? AND ?+? |
  16. | 1 | 1346791 | 5001 | UPDATE sbtest1 SET c=? WHERE id=? |
  17. | 1 | 1263259 | 5001 | DELETE FROM sbtest1 WHERE id=? |
  18. | 1 | 1191760 | 5001 | INSERT INTO sbtest1 (id, k, c, pad) VALUES (?, ?, ?, ?) |
  19. | 1 | 875343 | 5005 | BEGIN |
  20. +----+----------+------------+-------------------------------------------------------------+

至此,MySQL的读写分离结束。

MySQL读写分离之——ProxySQL的更多相关文章

  1. mysql读写分离——中间件ProxySQL的简介与配置

    mysql实现读写分离的方式 mysql 实现读写分离的方式有以下几种: 程序修改mysql操作,直接和数据库通信,简单快捷的读写分离和随机的方式实现的负载均衡,权限独立分配,需要开发人员协助. am ...

  2. mysql读写分离(proxySQL) lamp+proxysql+nfs

    先在主从节点安装mysql [root@master-mariadb ~]# yum install mariadb-server -y [root@slave-mariadb ~]# yum ins ...

  3. mysql中间件proxysql实现mysql读写分离

    目录 1. mysql实现读写分离的方式 2. ProxySQL简介 3. ProxySQL安装 4. ProxySQL的Admin管理接口 5. 和admin管理接口相关的变量 5.1 admin- ...

  4. mysql读写分离(PHP类)

    mysql读写分离(PHP类) 博客分类: php mysql   自己实现了php的读写分离,并且不用修改程序 优点:实现了读写分离,不依赖服务器硬件配置,并且都是可以配置read服务器,无限扩展 ...

  5. amoeba实现MySQL读写分离

    amoeba实现MySQL读写分离 准备环境:主机A和主机B作主从配置,IP地址为192.168.131.129和192.168.131.130,主机C作为中间件,也就是作为代理服务器,IP地址为19 ...

  6. PHP代码实现MySQL读写分离

    关于MySQL的读写分离有几种方法:中间件,Mysql驱动层,代码控制 关于中间件和Mysql驱动层实现Mysql读写分离的方法,今天暂不做研究, 这里主要写一点简单的代码来实现由PHP代码控制MyS ...

  7. 转:Mysql读写分离实现的三种方式

    1 程序修改mysql操作类可以参考PHP实现的Mysql读写分离,阿权开始的本项目,以php程序解决此需求.优点:直接和数据库通信,简单快捷的读写分离和随机的方式实现的负载均衡,权限独立分配缺点:自 ...

  8. 使用Atlas实现MySQL读写分离+MySQL-(Master-Slave)配置

    参考博文: MySQL-(Master-Slave)配置  本人按照博友北在北方的配置已成功  我使用的是 mysql5.6.27版本. 使用Atlas实现MySQL读写分离 数据切分——Atlas读 ...

  9. MySQL读写分离技术

    1.简介 当今MySQL使用相当广泛,随着用户的增多以及数据量的增大,高并发随之而来.然而我们有很多办法可以缓解数据库的压力.分布式数据库.负载均衡.读写分离.增加缓存服务器等等.这里我们将采用读写分 ...

随机推荐

  1. URL网络编程

    package com.atguigu.java1; import java.io.FileOutputStream; import java.io.IOException; import java. ...

  2. javaScript去重的11种方法

    前言 去重是开发和面试中经常遇到的问题,下面是总结的 11 种去重方法 方法 示例数组 var arr = [1, 2, 4, 5, 5, 2, 1, 1, 4, 6] set + 解构赋值 这种方法 ...

  3. C++多文件源程序

    一.多文件结构的源代码组织 一个C++程序开发工程(project)可以包含多个源程序文件,一个源程序文件(.cpp)可以包含多个函数.一个函数只能集中放在一个源程序文件中,不能将其定义代码拆开存放在 ...

  4. Codeforces Round #801 (Div. 2) and EPIC Institute of Technology Round(C,D题解)

    Codeforces Round #801 (Div. 2) and EPIC Institute of Technology Round C - Zero Path 在这道题目中,不可以真正地进行寻 ...

  5. 用JavaScript写一个进度条

    var porpressBar = document.getElementById('progressBar') var info = document.getElementById('info') ...

  6. 利用MySQL Router构建读写分离MGR集群

    GreatSQL社区原创内容未经授权不得随意使用,转载请联系小编并注明来源. 目录 1. 部署MySQL Router 2. 启动mysqlrouter服务 3. 确认读写分离效果 4. 确认只读负载 ...

  7. 主流前沿的开源监控和报警系统Prometheus+Grafana入门之旅

    Prometheus概述 定义 Prometheus 官网地址 https://prometheus.io/ Prometheus 官网文档地址 https://prometheus.io/docs/ ...

  8. 3052 [USACO12MAR]摩天大楼里的奶牛Cows in a Skyscraper (状压DP,IDA*)

    状压DP: #include <iostream> #include <cstdio> #include <cstring> #include <algori ...

  9. HDU 1542/POJ 1151 Atlantis (scaning line + segment tree)

    A template of discretization + scaning line + segment tree. It's easy to understand, but a little di ...

  10. FormData 和表单元素(form)的区别

    Form 元素 <form>元素表示文档中的一个区域,此区域包含交互控件,用于向 Web 服务器提交信息(文件.字符).下面称之为表单元素或表单. 要向 Web 服务器提交信息,我们必须要 ...