Java 中使用 Cetus 实现读写分离

[复制链接]
发表于 2025-4-2 17:55:50 | 显示全部楼层 |阅读模式

在 Java 中使用 Cetus 实现读写分离,可以通过以下步骤完成配置和代码实现:

1. 安装和配置 Cetus

首先,需要安装并配置 Cetus 以实现读写分离功能。

安装步骤

  1. 安装依赖

    yum install cmake gcc glib2-devel flex libevent-devel mysql-devel gperftools-libs -y
    
  2. 下载源码

    cd /root/tools && git clone https://github.com/Lede-Inc/cetus.git
    
  3. 编译安装

    cd cetus/ && mkdir build/ && cd build/
    cmake ../ -DCMAKE_BUILD_TYPE=Debug -DCMAKE_INSTALL_PREFIX=/usr/local/cetus -DSIMPLE_PARSER=ON && make install
    
  4. 配置文件
    编辑 /usr/local/cetus/conf/proxy.conf 文件,配置主从库信息:

    [cetus]
    daemon = true
    plugins=proxy,admin
    proxy-address=127.0.0.1:3308
    proxy-backend-addresses=主库ip:port
    proxy-read-only-backend-addresses=从库ip:port
    admin-address=127.0.0.1:3309
    admin-username=admin
    admin-password=admin
    default-db=your_database
    default-username=your_user
    default-pool-size=100
    log-file=/usr/local/cetus/logs/cetus.log
    log-level=debug
    

    编辑 /usr/local/cetus/conf/users.json 文件,配置用户信息:

    {
      "users": [
        {
          "user": "your_user",
          "client_pwd": "client_password",
          "server_pwd": "mysql_password"
        }
      ]
    }
    
  5. 启动 Cetus

    /usr/local/cetus/bin/cetus --defaults-file=/usr/local/cetus/conf/proxy.conf
    

2. Java 代码中的配置

在 Java 应用中,可以通过连接池(如 HikariCP)连接到 Cetus 代理,从而实现读写分离。

数据源配置

在 Java 代码中,配置一个数据源连接到 Cetus 的代理端口。Cetus 会自动根据读写操作将请求路由到主库或从库。

import com.zaxxer.hikari.HikariConfig;
import com.zaxxer.hikari.HikariDataSource;

import javax.sql.DataSource;

public class DataSourceConfig {
    public static DataSource createDataSource() {
        HikariConfig config = new HikariConfig();
        config.setJdbcUrl("jdbc:mysql://127.0.0.1:3308/your_database");
        config.setUsername("your_user");
        config.setPassword("client_password");
        config.setDriverClassName("com.mysql.cj.jdbc.Driver");
        return new HikariDataSource(config);
    }
}

数据访问代码

在数据访问层(DAO)中,使用上述数据源进行数据库操作。由于 Cetus 已经处理了读写分离,因此在代码中无需额外区分主从库。

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

public class UserDao {
    private DataSource dataSource;

    public UserDao(DataSource dataSource) {
        this.dataSource = dataSource;
    }

    public void insertUser(String name) {
        try (Connection conn = dataSource.getConnection();
             PreparedStatement ps = conn.prepareStatement("INSERT INTO users (name) VALUES (?)")) {
            ps.setString(1, name);
            ps.executeUpdate();
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }

    public String getUser(int id) {
        try (Connection conn = dataSource.getConnection();
             PreparedStatement ps = conn.prepareStatement("SELECT name FROM users WHERE id = ?")) {
            ps.setInt(1, id);
            try (ResultSet rs = ps.executeQuery()) {
                if (rs.next()) {
                    return rs.getString("name");
                }
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return null;
    }
}

3. 使用示例

在业务逻辑中,通过 UserDao 进行数据库操作。

public class Main {
    public static void main(String[] args) {
        DataSource dataSource = DataSourceConfig.createDataSource();
        UserDao userDao = new UserDao(dataSource);

        // 写操作
        userDao.insertUser("Alice");

        // 读操作
        String userName = userDao.getUser(1);
        System.out.println("User Name: " + userName);
    }
}

4. 注意事项

  • 确保 Cetus 的配置文件中正确设置了主从库的地址和端口。
  • 在 Java 代码中,只需连接到 Cetus 的代理端口,Cetus 会自动处理读写分离。
  • 如果需要更复杂的读写分离策略(如负载均衡),可以在 Cetus 配置中进行调整。

通过以上步骤,可以在 Java 应用中轻松实现基于 Cetus 的 MySQL 读写分离。

GMT+8, 2025-4-20 17:13 , Processed in 0.069427 second(s), 35 queries Archiver|手机版|小黑屋|Attic ( 京ICP备2020048627号 )

快速回复 返回顶部 返回列表