找回密码
 立即注册
首页 业界区 安全 数据库服务读写分离架构

数据库服务读写分离架构

晾棋砷 4 小时前
数据库服务读写分离架构

准备工作
  1. 读写分离架构作用:主要可以实现将大量读请求,实现负载均衡,从而减少单点数据库并发访问压力
  2. 读写分离架构软件:ProxySQL 数据中间件(客户端 -- 中间件软件 -- 数据库服务端)
  3. 读写分离架构搭建:
  4. 架构环境规划
  5. 主库     10.0.0.51
  6. 从库     10.0.0.52
  7. 从库     10.0.0.53
  8. MHA      10.0.0.54  ProxySQL
  9. ProxySQL 10.0.0.55
  10. ProxySQL 10.0.0.56
复制代码
开始搭建
  1. 步骤一:下载中间件软件并进行安装
  2. proxySQL软件下载链接:https://www.proxysql.com/documentation/installing-proxysql
  3. rpm -ivh proxysql-2.4.6-1-centos7.x86_64.rpm
  4. systemctl start proxysql
  5. ss -lntup|grep proxysql
  6. tcp    LISTEN     0      128       *:6032                  *:*                   users:(("proxysql",pid=23714,fd=46))
  7. tcp    LISTEN     0      128       *:6033                  *:*                   users:(("proxysql",pid=23714,fd=34))
  8. 6032:此端口表示连接访问后,可以对proxysql程序进行管理(管理员/运维人员)
  9. 6033:此端口表示连接访问后,可以对proxysql程序进行应用(前端程序访问)
  10. 步骤二:读写分离中间件软件功能配置
  11. mysql -uadmin -padmin -h127.0.0.1 -P6032
  12. 主要是对特定表做-增删改查看操作
  13. mysql_replication_hostgroups   -- 可以存储读写分离分组信息
  14. 作用:可以定义读写分离分组信息   www bbs game
  15. -- 读组:后面会将可以进行读取操作的数据库节点划分到此分组中
  16. -- 写组:后面会将可以进行存储操作的数据库节点划分到此分组中
  17. insert into mysql_replication_hostgroups(writer_hostgroup,reader_hostgroup,comment) values(10,20,'proxy');
  18. mysql> select * from mysql_replication_hostgroups;
  19. +------------------+------------------+------------+---------+
  20. | writer_hostgroup | reader_hostgroup | check_type | comment |
  21. +------------------+------------------+------------+---------+
  22. | 10               | 20               | read_only  | proxy   |
  23. +------------------+------------------+------------+---------+
  24. -- 在分组表中进行分组设置
  25.    10 写组  10.0.0.51 主库--写 10.0.0.51      
  26.    20 读组  10.0.0.51 主库--写 10.0.0.52 10.0.0.52  10.0.0.53   51 52  53     61 62 63   71....
  27.    30 写组  10.0.0.61
  28.    40 读组  10.0.0.62  10.0.0.63
  29.    save mysql servers to disk;
  30.    load mysql servers to runtime;
  31. PS:以上表信息添加设置后,需要调整从库只读变量信息(set global read_only=1)
  32. mysql_servers                  -- 可以定义节点信息属于哪个分组   
  33. 10.0.0.51/10.0.0.50    写组-10号组
  34. 10.0.0.52/10.0.0.53    读组-20号组
  35. insert into mysql_servers(hostgroup_id,hostname,port) values (10,'10.0.0.51',3306);
  36. insert into mysql_servers(hostgroup_id,hostname,port) values (20,'10.0.0.52',3306);
  37. insert into mysql_servers(hostgroup_id,hostname,port) values (20,'10.0.0.53',3306);
  38. save mysql servers to disk;
  39. load mysql servers to runtime;
  40. global_variables               -- 可以实现全局功能设置
  41. create user monitor@'%' identified with mysql_native_password by '123';
  42. grant replication client on *.* to monitor@'%';
  43. -- 在主节点上创建proxysql监控用户
  44. mysql> select * from global_variables where variable_name='mysql-monitor_username' or variable_name='mysql-monitor_password';
  45. +------------------------+----------------+
  46. | variable_name          | variable_value |
  47. +------------------------+----------------+
  48. | mysql-monitor_password | 123            |
  49. | mysql-monitor_username | monitor        |
  50. +------------------------+----------------+
  51. mysql-monitor_usernam   -- proxysql监控用户信息   
  52. mysql-monitor_password  -- proxysql监控用户密码   
  53. update global_variables set variable_value='monitor' where variable_name='mysql-monitor_username';
  54. -- 修改监控用户名称
  55. update global_variables set variable_value='123' where variable_name='mysql-monitor_password';
  56. -- 修改监控用户密码
  57. load mysql variables to runtime;
  58. save mysql variables to disk;
  59. proxysql中配置监控用户:
  60. 1)对后端节点做健康检测;
  61. 2)对后端数据库节点会检测主从身份
  62.    不会根据配置信息取识别主从节点信息 读节点或写节点 -- select @@read_only == 0 写节点  1 读节点)
  63. mysql_users           -- 可以设置定义连接中间的用户信息,并且可以利用用户表中用户信息连接后端数据库
  64. create user root@'%' identified with mysql_native_password by '123456';
  65. grant all on *.* to root@'%';
  66. insert into mysql_users(username,password,default_hostgroup) values('root','123456',10);
  67. load mysql users to runtime;
  68. save mysql users to disk;
  69. mysql_query_rules     -- 可以进行读写分离策略配置   
  70. insert into mysql_query_rules(rule_id,active,match_pattern,destination_hostgroup,apply) values (1,1,'^select.*for update$',10,1);
  71. insert into mysql_query_rules(rule_id,active,match_pattern,destination_hostgroup,apply) values (2,1,'^select',20,1);
  72. insert into mysql_query_rules(rule_id,active,match_pattern,destination_hostgroup,apply) values (结尾,1,'.*',10,1);
  73. -- 在以上表中最后一行会有隐藏策略,将没有匹配的所有语句都会发送给写组处理
  74. load mysql query rules to runtime;
  75. save mysql query rules to disk;
  76. 步骤三:读写分离访问测试
  77. 写测试
  78. mysql -uroot -p123456 -h10.0.0.54 -P6033 -e "begin;select @@server_id;commit;"
  79. -- 以上语句执行完,会输出server_id=1信息
  80. 读测试
  81. mysql -uroot -p123456 -h10.0.0.54 -P6033 -e "select @@server_id;"
  82. -- 以上语句多次执行,会输出server_id=1/2/3信息
  83. proxysql读写分离架构搭建设置完毕,需要进行应用交付: proxysql用户信息  proxysql网络信息
复制代码
扩展设置
1)基于用户实现负载均衡
  1. read  用户  可以读取数据 将此用户访问请求转发给 所有节点   代码中(连接数据库信息-wp_config.php-db_user-read)
  2. write 用户  可以存储数据 将此用户访问请求转发给 主库节点   代码中(连接数据库信息-wp_config.php-db_user-write)
  3. insert into mysql_users(username,password,default_hostgroup) values ('write','123',10),('reader','123',20);
  4. load mysql users to runtime;
  5. save mysql users to disk;
  6. insert into mysql_query_rules(rule_id,active,username,destination_hostgroup,apply)
  7. values (1,1,'write',10,1),(2,1,'reader',20,1);
  8. load mysql users to runtime;
  9. save mysql users to disk;
  10. 写测试
  11. mysql -uwrite -p123 -h10.0.0.54 -P6033 -e "select @@server_id;"
  12. -- 以上语句多次执行,会输出server_id=1信息
  13. 读测试
  14. mysql -uread -p1234 -h10.0.0.54 -P6033 -e  "select @@server_id;"
  15. -- 以上语句多次执行,会输出server_id=1/2/3信息
  16. proxysql读写分离架构搭建设置完毕,需要进行应用交付: proxysql用户信息(读操作-read 写操作-write)  proxysql网络信息
复制代码
2)基于端口实现负载均衡
  1. 6033 -- 读数据端口  前端访问此端口,中间件服务会将访问请求转发给所有节点
  2. 6034 -- 写数据端口  前端访问此端口,中间件服务会将访问请求转发给主库节点
  3. # 修改proxySQL监听SQL流量的端口号,监听多端口信息
  4. set mysql-interfaces='0.0.0.0:6033;0.0.0.0:6034'
  5. # 使监听端口配置信息生效
  6. save mysql variables to disk;
  7. systemctl restart proxysql
  8. insert into mysql_query_rules(rule_id,active,proxy_port,destination_hostgroup,apply)
  9. values(1,1,6034,10,1),(2,1,6033,20,1);
  10. load mysql query rules to runtime;
  11. save mysql query rules to disk;
  12. -- 除了基于端口进行分离,还可以基于监听地址(修改字段proxy_addr即可),也可以基于客户端地址(修改字段client_addr字段即可);
  13. 写测试
  14. mysql -uroot -p123 -h10.0.0.54 -P6033 -e "select @@server_id;"
  15. -- 以上语句多次执行,会输出server_id=1/2/3信息
  16. 读测试
  17. mysql -uroot -p123 -h10.0.0.54 -P6034 -e "select @@server_id;"
  18. -- 以上语句多次执行,会输出server_id=1信息
复制代码
redis数据库服务管理应用

1)redis数据库服务功能作用(缓存型数据库服务 非关系型数据库服务)
  1. -- 可以加快热点数据存储和调取  
  2. -- 可以实现数据库页缓存/缓冲功能      高并发访问  大量写操作 磁盘IO消耗激增
  3. -- 可以实现业务访问消息队列功能  
复制代码
2)redis数据库服务安装部署
  1. 步骤一:下载安装软件程序
  2. 下载软件链接地址
  3. https://redis.io/download/#redis-downloads
  4. https://download.redis.io/releases
  5. tar xf redis-6.2.10.tar.gz
  6. ln -s redis-6.2.10 redis
  7. yum install -y gcc automake autoconf libtool make
  8. cd /usr/local/redis
  9. make
  10. vim /etc/profile
  11. export PATH="$PATH:/usr/local/mysql/bin:/usr/local/mongodb/bin:/usr/local/redis/src/"
  12. source /etc/profile
  13. 步骤二:编写配置信息启动redis服务
  14. mkdir -p /data/6379
  15. vim /data/6379/redis.conf
  16. daemonize yes
  17. -- 表示定义服务程序在后台以守护进程方式运行
  18. port 6379
  19. -- 表示定义服务的默认端口
  20. logfile /data/6379/redis.log
  21. -- 表示服务运行日志存放路径
  22. dir /data/6379  
  23. -- 表示定义数据目录路径,用于持久化应用时存储数据
  24. dbfilename dump.rdb
  25. -- 表示持久化存储的数据文件名称
  26. redis-server /data/6379/redis.conf
  27. redis-cli
  28. 127.0.0.1:6379> set stu_name 'xiaoA'
  29. OK
  30. 127.0.0.1:6379> get stu_name
  31. "xiaoA"
复制代码
3)redis数据库基础管理
  1. -- 远程连接管理(安全配置管理)
  2. redis-cli -h 10.0.0.51 -p 6379
  3. DENIED Redis is running in protected mode because protected mode is enabled, no bind address was specified, no authentication password is requested to clients.
  4. redis启动运行后,redis服务会默认开启安全保护模式(远程连接redis不能进行任何管理操作),也没有做地址绑定和密码认证
  5. In this mode connections are only accepted from the loopback interface.
  6. 在这个安全模式下,可以利用loopback接口连接数据库(本地登录),进行管理操作
  7. If you want to connect from external computers to Redis you may adopt one of the following solutions:
  8. 如果想实现外部设备远程连接管理redis数据库服务,可以按照以下建议做设置调整
  9. 1) Just disable protected mode sending the command 'CONFIG SET protected-mode no' from the loopback interface by connecting to Redis from the same host the server is running, however MAKE SURE Redis is not publicly accessible from internet if you do so. Use CONFIG REWRITE to make this change permanent.
  10. 2) Alternatively you can just disable the protected mode by editing the Redis configuration file, and setting the protected mode option to 'no', and then restarting the server.
  11. 3) If you started the server manually just for testing, restart it with the '--protected-mode no' option.
  12. 以上三个建议都表示可以禁用安全保护功能
  13. 4) Setup a bind address or an authentication password.
  14. 进行地址绑定设置或进行密码认证设置
  15. NOTE: You only need to do one of the above things in order for the server to start accepting connections from the outside.
  16. vim /data/6379/redis.conf
  17. bind 10.0.0.51 127.0.0.1
  18. requirepass 123456
  19. redis-cli -h 10.0.0.51 -p 6379
  20. 10.0.0.51:6379> set stu_name02 xiaoB
  21. (error) NOAUTH Authentication required.
  22. 10.0.0.51:6379> auth 123456
  23. OK
  24. -- 需要完成密码认证
  25. redis-cli -h 10.0.0.51 -p 6379 -a 123456
  26. -- 利用-a选项参数进行远程登录认证
  27. Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
  28. 10.0.0.51:6379> set stu_name03 xiaoC
  29. OK
  30. -- 数据库持久化存储设置  
  31. RDB方式实现持久化存储(默认选择)
  32. 存储特点:类似于将内存中数据信息做了快照处理,将生成快照信息保存到文件中(rdb)
  33. 应用特点:数据存储恢复效率快/可以用于主从同步/存储数据安全性较低
  34. dir /data/6379
  35. dbfilename dump.rdb
  36. 手工保存数据:
  37. save/bgsave
  38. 自动保存数据(触发性)
  39. save 900 1   
  40. -- 表示900秒(15分钟)内有1个更改
  41. save 300 10
  42. -- 表示300秒(5分钟)内有10个更改
  43. save 60 10000  
  44. -- 表示60s内有10000个更改
  45. AOF方式实现持久化存储
  46. 存储特点:类似于mysql中的binlog日志,会将数据库中所有操作信息记录到文件中(aof)
  47. 应用特点:可以灵活进行数据读取或恢复/存储数据安全性更高
  48. dir /data/6379
  49. appendonly yes
  50. -- 是否打开aof日志功能
  51. appendfsync always  (安全选择)              
  52. -- 表示每1个命令,都立即同步到AOF         
  53. appendfsync everysec  
  54. -- 表示每秒写1次
  55. appendfsync no      (性能选择)
  56. -- 由操作系统来决定是否将操作语句信息写入文件
  57. -- 数据库服务配置管理  
  58. 方式一:永久配置
  59. vim redis.conf
  60. 配置项 配置内容
  61. 方式二:临时配置/动态配置
  62. CONFIG SET 配置项 配置内容  
  63. config get *
  64. -- 查看redis数据库中所有配置项信息
复制代码
4)redis数据库架构搭建

[code]-- 主从同步架构环境规划主库  10.0.0.51  6380  从库  10.0.0.51  6381从库  10.0.0.51  6382步骤一:主从数据库实例环境准备mkdir -p /data/{6380..6382}主库配置cat > /data/6380/redis.conf

相关推荐

您需要登录后才可以回帖 登录 | 立即注册