在 Java 中使用 Cetus 实现读写分离,可以通过以下步骤完成配置和代码实现:
1. 安装和配置 Cetus
首先,需要安装并配置 Cetus 以实现读写分离功能。
安装步骤
-
安装依赖
yum install cmake gcc glib2-devel flex libevent-devel mysql-devel gperftools-libs -y
-
下载源码
cd /root/tools && git clone https://github.com/Lede-Inc/cetus.git
-
编译安装
cd cetus/ && mkdir build/ && cd build/
cmake ../ -DCMAKE_BUILD_TYPE=Debug -DCMAKE_INSTALL_PREFIX=/usr/local/cetus -DSIMPLE_PARSER=ON && make install
-
配置文件
编辑 /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"
}
]
}
-
启动 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 读写分离。