mysq通过ProxySQL实现读写分离

本文介绍了如何通过ProxySQL实现MySQL的读写分离。首先,讲解了ProxySQL作为MySQL中间件的角色及其特性,包括其读/写分离、监控和缓存等功能。接着,详细阐述了ProxySQL的安装步骤,强调了在实现读写分离前需确保主从复制配置正确。在配置ProxySQL时,重点讨论了如何添加和管理后端节点,设置读写组,并创建路由规则以确保SELECT语句被正确路由到读组,而写操作则路由到写组。最后,通过测试验证了读写分离的正确性。
摘要由CSDN通过智能技术生成

mysq通过ProxySQL实现读写分离

常见的读写分离应用

	Oracle:mysql-proxy
	qihoo:Atlas
	美团:dbproxy
	网易:cetus
	amoeba
	阿里巴巴:cobar 基于amoeba研发
	Mycat:基于cobar实现
	ProxySQL

ProxySQL:MySQL中间件

  • 版本:
    • 官方版
    • percona版:percona公司基于官方版本用C++语言开发,性能更优
  • 特点:具有中间件所需的绝大多数功能,包括:
    • 多种方式的读/写分离
    • 定制基于用户、基于schema、基于语句的规则对SQL语句进行路由
    • 缓存查询结果
    • 后端节点监控

官方站点:https://proxysql.com/

ProxySQL安装:

  • 准备:

    • 实现读写分离前,先实现主从复制

      注:slave服务器 配置文件中必须为 read_only=1,ProxySQL通过read_only=1参数,确定哪个是salve服务器

  • 基于YUM仓库安装:

    [ root@centos ~]# cat <<EOF | tee /etc/yum.repos.d/proxysql.repo
    [proxysql_repo]
    name= ProxySQL YUM repository
    baseurl=http://repo.proxysql.com/ProxySQL/proxysql-1.4.x/centos/\$releasever
    gpgcheck=1
    gpgkey=http://repo.proxysql.com/ProxySQL/repo_pub_key
    EOF
  • 基于RPM下载安装:https://github.com/sysown/proxysql/releases

  • ProxySQL的组成:

    • 服务脚本:/etc/init.d/proxysql
    • 配置文件:/etc/proxysql.cnf
    • 主程序:/usr/bin/proxysql
    • 基于SQLITE的数据库文件:/var/lib/proxysql/
  • 启动ProxySQL:service proxysql start

    • 启动后会监听两个默认端口:
      • 6032:ProxySQL的管理端口
      • 6033:ProxySQL对外提供服务的端口
  • 使用mysql客户端连接到ProxySQL的管理端口6032,默认管理员用户和密码都是admin

	[ root@weiying ~]# mysql -uadmin -padmin -p6032 -hhost
  • ProxySQL实现读写分离:

    内置了SQLite小型数据库,里面存储了proxysql的设置

    • 内置的数据库说明:
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
实现MySQL多租户数据隔离的另一种常见方法是通过在表中添加一个`tenant_id`列来标识不同的租户。下面是使用Java代码实现该方法的步骤: 1. 创建一个Java类来管理数据库连接和操作。这个类应该包含以下方法: ``` public class DatabaseManager { private static final String DATABASE_HOST = "localhost"; private static final String DATABASE_USERNAME = "root"; private static final String DATABASE_PASSWORD = "password"; private static final String DATABASE_NAME = "my_database"; private static final String DATABASE_DRIVER = "com.mysql.jdbc.Driver"; private Connection connection; public DatabaseManager() throws SQLException, ClassNotFoundException { Class.forName(DATABASE_DRIVER); this.connection = DriverManager.getConnection("jdbc:mysql://" + DATABASE_HOST + "/" + DATABASE_NAME, DATABASE_USERNAME, DATABASE_PASSWORD); } public void executeQuery(String query) throws SQLException { Statement statement = connection.createStatement(); statement.executeQuery(query); statement.close(); } public void executeUpdate(String query) throws SQLException { Statement statement = connection.createStatement(); statement.executeUpdate(query); statement.close(); } public void closeConnection() throws SQLException { this.connection.close(); } } ``` 2. 创建一个Java类来管理租户列表。这个类应该包含以下方法: ``` public class TenantManager { private Map<String, DatabaseManager> tenantDatabaseManagerMap = new HashMap<>(); public void addTenant(String tenantId) throws SQLException, ClassNotFoundException { if (!tenantDatabaseManagerMap.containsKey(tenantId)) { DatabaseManager databaseManager = new DatabaseManager(); databaseManager.executeUpdate("CREATE TABLE IF NOT EXISTS table_name (id INT PRIMARY KEY, column1 VARCHAR(255), column2 VARCHAR(255), tenant_id VARCHAR(36))"); tenantDatabaseManagerMap.put(tenantId, databaseManager); } } public DatabaseManager getDatabaseManager(String tenantId) { return tenantDatabaseManagerMap.get(tenantId); } public void closeAllConnections() throws SQLException { for (DatabaseManager databaseManager : tenantDatabaseManagerMap.values()) { databaseManager.closeConnection(); } tenantDatabaseManagerMap.clear(); } } ``` 3. 在每次请求到达时,从请求中获取租户ID,并使用TenantManager获取对应的DatabaseManager对象。然后使用该对象执行数据库操作。例如: ``` public class RequestHandler { private static final String TENANT_HEADER = "Tenant-Id"; private TenantManager tenantManager; public RequestHandler() { tenantManager = new TenantManager(); } public void handleRequest(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException, SQLException, ClassNotFoundException { String tenantId = request.getHeader(TENANT_HEADER); if (tenantId == null) { response.setStatus(HttpServletResponse.SC_BAD_REQUEST); response.getWriter().println("Tenant Id is required."); return; } DatabaseManager databaseManager = tenantManager.getDatabaseManager(tenantId); if (databaseManager == null) { tenantManager.addTenant(tenantId); databaseManager = tenantManager.getDatabaseManager(tenantId); } String insertQuery = "INSERT INTO table_name (id, column1, column2, tenant_id) VALUES (1, 'value1', 'value2', '" + tenantId + "')"; databaseManager.executeUpdate(insertQuery); String selectQuery = "SELECT * FROM table_name WHERE tenant_id = '" + tenantId + "'"; ResultSet resultSet = databaseManager.executeQuery(selectQuery); while (resultSet.next()) { int id = resultSet.getInt("id"); String column1 = resultSet.getString("column1"); String column2 = resultSet.getString("column2"); // process results } resultSet.close(); } public void destroy() throws SQLException { tenantManager.closeAllConnections(); } } ``` 以上就是使用Java代码实现MySQL通过表添加`tenant_id`列来标识不同租户的方法。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值