# Windows下编译运行PolarDB-X
## 安装WSL
参考官方文档:https://docs.microsoft.com/en-us/windows/wsl/install
## 安装CentOS 7
微软商店里没有提供CentOS 7,可以在这里下载:https://github.com/mishamosher/CentOS-WSL/releases
验证过的版本是:https://github.com/mishamosher/CentOS-WSL/releases/tag/7.9-2111
解压后运行CentOS7.exe(右键以管理员身份运行)即可完成安装,再次运行CentOS7.exe即可打开一个终端。
## 环境准备
1. 安装wget:
```
yum install wget -y
```
2. 使用阿里云的yum仓库:
```
cd /etc/yum.repos.d/ && \
wget -O CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo && \
yum clean all
cd /root
```
3. 安装工具链
```
yum install -y git
yum install -y centos-release-scl
yum install -y mysql
yum install -y java-1.8.0-openjdk-devel
yum install -y make automake openssl-devel ncurses-devel bison libaio-devel
yum install -y devtoolset-7-gcc devtoolset-7-gcc-c++ devtoolset-7-binutils
echo "source /opt/rh/devtoolset-7/enable" >>/etc/profile && source /etc/profile
```
4. 安装cmake:
仓库里没有cmake3,需要从源码编译安装
```
wget https://cmake.org/files/v3.23/cmake-3.23.2.tar.gz && tar -zxvf cmake-3.23.2.tar.gz && cd cmake-3.23.2/
./bootstrap && gmake && gmake install
```
5. 创建admin用户:
CN与DN都不允许以root用户启动,需要创建一个用户。
```
useradd -ms /bin/bash admin && \
echo "admin:admin" | chpasswd && \
echo "admin ALL=(ALL) NOPASSWD: ALL" >> /etc/sudoers && \
su admin
cd /home/admin
```
6. 安装maven:
仓库中的maven版本太老了,装一个最新版本。
```
wget https://dlcdn.apache.org/maven/maven-3/3.8.6/binaries/apache-maven-3.8.6-bin.tar.gz && tar -zxvf apache-maven-3.8.6-bin.tar.gz
echo 'PATH=/home/admin/apache-maven-3.8.6/bin:$PATH' >> /home/admin/.bashrc && \
echo "export PATH" >> /home/admin/.bashrc && \
source /home/admin/.bashrc
```
国内使用阿里云的maven仓库比较快,https://developer.aliyun.com/mvn/guide
修改maven的配置文件:
```
vi /home/admin/apache-maven-3.8.6/conf/settings.xml
```
在``标签中添加 mirror 子节点:
```
aliyunmaven
*
阿里云公共仓库
https://maven.aliyun.com/repository/public
```
## 编译PolarDB-X
1. 下载编译工程
```
git clone https://github.com/ApsaraDB/PolarDB-X.git
cd PolarDB-X
```
2. 编译
```
make
```
注意:如果机器内存<=16G,请修改PolarDB-X/Makefile中编译的并行度,否则容易出现OOM,将 `CPU_CORES` 修改为 2

3. 运行
```
./build/run/bin/polardb-x.sh start
```
4. 停止
```
./build/run/bin/polardb-x.sh stop
```
## 使用IDEA开发GalaxySQL(CN)
我们使用IDEA来运行CN的代码,并使用CentOS中启动的GalaxyEngine节点作为GMS与DN节点。
1. WSL与Windows是同一个LAN内的两个IP,在上述的Demo中,GMS中记录的DN的IP为`127.0.0.1`,Windows无法直接通过这个IP来访问与GMS/DN,因此需要获取到WSL的LAN IP,并做相应的替换。
在CentOS中执行`ip addr`,记录eth0中的IP,如本例中,IP为`172.27.47.106`
```
ip addr
1: lo: mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: bond0: mtu 1500 qdisc noop state DOWN group default qlen 1000
link/ether 7a:44:78:58:e8:32 brd ff:ff:ff:ff:ff:ff
3: dummy0: mtu 1500 qdisc noop state DOWN group default qlen 1000
link/ether 7a:e5:bd:1e:a3:ba brd ff:ff:ff:ff:ff:ff
4: tunl0@NONE: mtu 1480 qdisc noop state DOWN group default qlen 1000
link/ipip 0.0.0.0 brd 0.0.0.0
5: sit0@NONE: mtu 1480 qdisc noop state DOWN group default qlen 1000
link/sit 0.0.0.0 brd 0.0.0.0
6: eth0: mtu 1500 qdisc mq state UP group default qlen 1000
link/ether 00:15:5d:05:db:9b brd ff:ff:ff:ff:ff:ff
inet 172.27.47.106/20 brd 172.27.47.255 scope global eth0
valid_lft forever preferred_lft forever
inet6 fe80::215:5dff:fe05:db9b/64 scope link
valid_lft forever preferred_lft forever
```
2. 在CentOS上登录GMS,并修改DN的IP。
```
mysql -h127.1 -P4886 -uroot polardbx_meta_db_polardbx -e 'update storage_info set ip="172.27.47.106";'
```
3. Kill掉CentOS中的CN进程,避免冲突:
```
[admin@DESKTOP-UGTN860 PolarDB-X]$ jps
13174 Jps
15625 DaemonBootStrap
16105 DumperBootStrap
16139 TaskBootStrap
17334 TddlLauncher
[admin@DESKTOP-UGTN860 PolarDB-X]$ kill -9 17334
```
4. 在Windows中clone代码:
```
git clone https://github.com/ApsaraDB/galaxysql.git
cd galaxysql
git submodule update --init
```
5. 在IDEA中打开该maven工程,并修改IDEA的maven仓库为阿里云的maven仓库:

6. 调整IDEA编译的内存上限:

7. 使用CentOS中的`PolarDB-X/build/run/galaxysql/conf/server.properties`内容覆盖IDEA中CN的`galaxysql\polardbx-server\src\main\resources`,并将`metaDbAddr`中的`127.0.0.1`修改为WSL的IP:

同时,修改代码中 polardbx-server/src/main/resources/server.properties 文件:
a. 将`metaDbAddr` 改为 `127.0.0.1:4886`
b. 将`metaDbXprotoPort` 改为 `34886`
c. 将`galaxyXProtocol` 改为 `2`
d. 在shell中执行这行命令以获取`metaDbPasswd`:`mysql -h127.1 -P4886 -uroot -padmin -D polardbx_meta_db_polardbx -e "select passwd_enc from storage_info where inst_kind=2"`
e. 增加`metaDbPasswd=<查询到的密码>` 。
8. 运行一次`com.alibaba.polardbx.server.TddlLauncher`,此时会启动失败
9. 修改`TddlLauncher`的`Run/Debug Configurations`,添加`dnPasswordKey=asdf1234ghjk5678
`到环境变量中:



10. 再次运行`com.alibaba.polardbx.server.TddlLauncher`即可
11. mysql终端可以连上本地的CN了
```
mysql -h 127.0.0.1 -upolardbx_root -p123456 -P8527
```
## 固定WSL的IP地址
注意,WSL2每次重启都会重新分配一个IP,这会导致GMS与`server.properties`中记录的IP失效。有一个折中的方法,执行以下命令,会分别为WSL2与Windows分配一个指定的IP地址:
```
wsl -d CentOS7 -u root ip addr add 192.168.50.2/24 broadcast 192.168.50.255 dev eth0 label eth0:1
netsh interface ip add address “vEthernet (WSL)” 192.168.50.1 255.255.255.0
```
这样可以将GMS与`server.properties`中的IP固定为`192.168.50.2`即可。
确保每次重启WSL后运行该命令。