草庐IT

9. 利用Docker快速构建MGR | 深入浅出MGR

GreatSQL社区 2023-03-28 原文
为了方面社区用户体验GreatSQL,我们同时还提供Docker镜像,本文详细介绍如何在Docker中部署GreatSQL,并且构建一个MGR集群。

本文涉及的运行环境如下:

[root@greatsql]# cat /etc/redhat-release CentOS Linux release 7.9.2009 (Core) [root@greatsql]# uname -a Linux GreatSQL 3.10.0-1160.11.1.el7.x86_64 #1 SMP Fri Dec 18 16:34:56 UTC 2020 x86_64 x86_64 x86_64 GNU/Linux

1、安装Docker

直接用yum安装docker,非常省事

[root@greatsql]# yum install -y docker 之后启动 docker 服务,并设置开机自启动

[root@greatsql]# systemctl enable docker [root@greatsql]# systemctl start docker

2、拉取GreatSQL镜像,并创建容器

2.1 拉取镜像

拉取GreatSQL官方镜像

[root@greatsql]# docker pull greatsql/greatsql docker pull greatsql/greatsql Using default tag: latest Trying to pull repository docker.io/greatsql/greatsql ... latest: Pulling from docker.io/greatsql/greatsql ... Digest: sha256:e3c7b3dcebcbb6e2a1ab60993f0999c9ce7e1c85e4a87ab4022d2c1351840f6f Status: Downloaded newer image for docker.io/greatsql/greatsql:latest 检查是否成功

[root@greatsql]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE docker.io/greatsql/greatsql latest 1130a28e310b 3 days ago 570 MB

2.2 创建新容器

之后,就可以直接创建一个新的容器了,先用常规方式

[root@greatsql]# docker run -d \ --name mgr1 --hostname=mgr1 \ -p 3306:3306 -p 33060:33060 -p 33061:33061 \ -e MYSQL_ALLOW_EMPTY_PASSWORD=1 \ -e MYSQL_IBP=1G \ -e MYSQL_MGR_NAME='aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaa1' \ -e MYSQL_MGR_LOCAL='172.17.0.2:33061' \ -e MYSQL_MGR_SEEDS='172.17.0.2:33061,172.17.0.3:33061,172.17.0.4:33061' \ -e MYSQL_INIT_MGR=1 \ -e MYSQL_MGR_USER='repl' \ -e MYSQL_MGR_USER_PWD='repl' \ -e MYSQL_SID=330602 greatsql/greatsql 几个参数分别解释如下

参数 必选/可选 默认值 解释
-d 必选 声明以daemon守护进程方式运行,而不是一次性运行
--name mgr1 可选 随机生成 指定容器名,方便后面调用
--hostname mgr1 可选 容器ID 指定容器内的主机名,否则会用容器ID作为主机名
-p 3306:3306 可选 指定容器要暴露的端口号,方便用TCP方式远程连接
-e MYSQL_ALLOW_EMPTY_PASSWORD=1 必选 允许root使用空密码(本案中启用该选项,为了方便),也可以指定密码,或者使用随机密码,下面介绍
-e MYSQL_IBP=1G 可选 128M 设置 innodb_buffer_pool_size 的值
-e MYSQL_MGR_NAME='aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaa1' 可选 aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaa1 设置MGR集群名
-e MYSQL_MGR_LOCAL='172.17.0.2:33061' 可选 172.17.0.2:33061 设置MGR本地节点IP+PORT
-e MYSQL_MGR_SEEDS='172.17.0.2:33061,<br/>172.17.0.3:33061,<br/>172.17.0.4:33061' 可选 172.17.0.2:33061,172.17.0.3:33061 设置MGR集群各节点列表
-e MYSQL_INIT_MGR=1 可选 自动初始化MGR相关工作
-e MYSQL_MGR_USER='repl' 可选 repl 设置MGR服务账户名
-e MYSQL_MGR_USER_PWD='repl' 可选 repl4MGR 设置MGR服务账户密码
-e MYSQL_SID 可选 3306+3位随机数 设置MySQL的server_id,利用MySQL Shell接管MGR时,要求每个实例的server_id要设置为不同值。如果不手动指定,则会自动生成随机数值
greatsql/greatsql,是镜像名,也可以指定为镜像的ID,例如 1130a28e310b

如果不想让 root 账户使用空密码,可以把 MYSQL_ALLOW_EMPTY_PASSWORD=1 参数替换成诸如 MYSQL_ROOT_PASSWORD='GreatSQL3#)^' 或者指定随机密码 MYSQL_RANDOM_ROOT_PASSWORD=1 即可。

当启用选项 MYSQL_INIT_MGR=1 时,会自动创建MGR所需的账户,并执行 CHANGE MASTER TO 指定MGR复制通道。若没有同时指定 MYSQL_MGR_USERMYSQL_MGR_USER_PWD 的话,则采用各自的默认值创建MGR账户。

这就成功创建一个新的容器了,并且会自动完成GreatSQL的初始化并启动。

2.3 容器管理

先确认容器的状态

[root@greatsql]# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 2e277c852f52 greatsql/greatsql "/docker-entrypoin..." 4 minutes ago Up 12 minutes 3306/tcp, 33060-33061/tcp mgr1 看到容器状态是Up的,表示已正常启动了。

再进入容器查看

[root@greatsql]# docker exec -it mgr1 /bin/bash [root@mgr1 ~]# mysqladmin ver ... Server version: 8.0.25-15 GreatSQL, Release 15, Revision c7feae175e0 Protocol version 10 Connection Localhost via UNIX socket UNIX socket /data/GreatSQL/mysql.sock Uptime: 11 min 19 sec Threads: 2 Questions: 2 Slow queries: 0 Opens: 120 Flush tables: 3 Open tables: 36 Queries per second avg: 0.002 看到容器已经完成初始化,并且可以直接无密码登入。

查看MGR账户及相应复制通道

[root@GreatSQL][(none)]> show grants for repl; +----------------------------------------------+ | Grants for repl@% | +----------------------------------------------+ | GRANT REPLICATION SLAVE ON *.* TO `repl`@`%` | | GRANT BACKUP_ADMIN ON *.* TO `repl`@`%` | +----------------------------------------------+ [root@GreatSQL][none]> select * from performance_schema.replication_group_members; +---------------------------+-----------+-------------+-------------+--------------+-------------+----------------+ | CHANNEL_NAME | MEMBER_ID | MEMBER_HOST | MEMBER_PORT | MEMBER_STATE | MEMBER_ROLE | MEMBER_VERSION | +---------------------------+-----------+-------------+-------------+--------------+-------------+----------------+ | group_replication_applier | | | NULL | OFFLINE | | | +---------------------------+-----------+-------------+-------------+--------------+-------------+----------------+

3、构建MGR集群

跨宿主机之间的docker容器网络通信相对麻烦一些,为了简单起见,本次先在单机环境下构建由3个docker容器组成的MGR集群。

3.1 创建专用子网

首先创建一个用于MGR集群的网络:

[root@greatsql]# docker network create mgr-net [root@greatsql]# docker network ls NETWORK ID NAME DRIVER SCOPE 70c3ac08c7a9 bridge bridge local 3a480a3ec570 host host local 191d6d902b26 mgr-net bridge local 1e3e6267dcda none null local 查看这个子网的配置信息:

[root@greatsql]# docker inspect mgr-net [ { "Name": "mgr-net", ... "Subnet": "172.18.0.0/16", <-- 网段 "Gateway": "172.18.0.1" <-- 网关 ...

3.2 创建3个新容器

分别启动三个docker容器:

[root@greatsql]# docker run -d \ --name mgr1 --hostname=mgr1 --net=mgr-net \ -e MYSQL_ALLOW_EMPTY_PASSWORD=1 \ -e MYSQL_MGR_LOCAL='172.18.0.2:33061' \ -e MYSQL_MGR_SEEDS='172.18.0.2:33061,172.18.0.3:33061,172.18.0.4:33061' \ -e MYSQL_INIT_MGR=1 \ greatsql/greatsql 后面的两个实例,只把 --name 和 --hostname 参数中的mgr1改成mgr2、mgr3,并且把 -e MYSQL_MGR_LOCAL='172.18.0.2:33061' 参数的的IP地址递增,例如 -e MYSQL_MGR_LOCAL='172.18.0.3:33061'

查看容器运行状态:

[root@greatsql]# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 1bcd23c6f378 1130a28e310b "/docker-entrypoin..." 2 minutes ago Up 2 minutes 3306/tcp, 33060-33061/tcp mgr3 9d12ab273d81 1130a28e310b "/docker-entrypoin..." 2 minutes ago Up 2 minutes 3306/tcp, 33060-33061/tcp mgr2 56fd564a1789 1130a28e310b "/docker-entrypoin..." 4 minutes ago Up 4 minutes 3306/tcp, 33060-33061/tcp mgr1 分别查看3个容器的IP地址:

[root@greatsql]# docker inspect mgr1 | grep IPAddress "SecondaryIPAddresses": null, "IPAddress": "172.18.0.2", "IPAddress": "172.18.0.2", 第一个容器的IP地址是 172.18.0.2,另外两个容器分别是 172.18.0.3172.18.0.4(递增关系)。因为我启动容器时指定的新创建的网络 mgr-net,所以是 172.18.0.0/24 网段。如果不指定新创建的网络,则默认应该是 172.17.0.0/24 网段,注意区别。

编辑三个容器下的 /etc/hosts 文件,加入所有节点的hostname配置:

172.18.0.2 mgr1 172.18.0.3 mgr2 172.18.0.4 mgr3 提醒:docker容器重启后,容器里的 /etc/hosts 文件内容会重置,所以建议用映射volumes的方式挂进来。

在宿主机上编辑好一个文件 /data/docker/hosts

[root@greatsql]# cat /data/docker/hosts 127.0.0.1 localhost.localdomain localhost 127.0.0.1 localhost4.localdomain4 localhost4 ::1 localhost.localdomain localhost ::1 localhost6.localdomain6 localhost6 172.18.0.2 mgr1 172.18.0.3 mgr2 172.18.0.4 mgr3 在创建docker容器时映射挂载到容器的 /etc/hosts 文件:

[root@greatsql]# docker run -d \ ... -v /data/docker/hosts:/etc/hosts \ ... greatsql/greatsql 也可以在创建容器时,直接用 --add-host 指定,例如:

[root@greatsql]# docker run -d \ ... --add-host "mgr1:172.18.0.2" --add-host "mgr2:172.18.0.3" --add-host "mgr3:172.18.0.4"\ ... greatsql/greatsql

3.3 初始化MGR集群

接下来准备初始化MGR集群。

选择第一个容器 mgr1 作为 PRIMARY节点,设置该容器的MGR的引导,然后启动MGR服务:

[root@greatsql]# docker exec -it mgr1 /bin/bash [root@mgr1 ~]# mysql -S/data/GreatSQL/mysql.sock ... #设置本节点为MGR引导启动节点,【注意】其他节点无需执行本操作 SET GLOBAL group_replication_bootstrap_group=ON; #启动MGR服务 START GROUP_REPLICATION; #启动完MGR服务后,关闭引导参数 SET GLOBAL group_replication_bootstrap_group=OFF; 因为在创建容器时已经完成了创建账户及授权等操作,所以可以直接启动MGR服务。如果在创建容器时未指定 -e MYSQL_INIT_MGR=1 选项,则还需要手动执行下面的命令创建账户,授权,并创建MGR复制通道:

SET SQL_LOG_BIN=0; CREATE USER repl IDENTIFIED with mysql_native_password BY 'repl4MGR'; GRANT REPLICATION SLAVE, BACKUP_ADMIN ON *.* TO repl; CHANGE MASTER TO MASTER_USER='repl', MASTER_PASSWORD='repl4MGR' FOR CHANNEL 'group_replication_recovery';

3.4 启动MGR服务

在另外的两个docker容器里,记住不要设置 group_replication_bootstrap_group=ON,直接启动 MGR服务即可。查看所有节点都启动后的MGR服务状态:

[root@GreatSQL][(none)]> select * from performance_schema.replication_group_members; +---------------------------+--------------------------------------+-------------+-------------+--------------+-------------+----------------+ | CHANNEL_NAME | MEMBER_ID | MEMBER_HOST | MEMBER_PORT | MEMBER_STATE | MEMBER_ROLE | MEMBER_VERSION | +---------------------------+--------------------------------------+-------------+-------------+--------------+-------------+----------------+ | group_replication_applier | 63b55594-da80-11eb-94bf-0242ac120003 | mgr2 | 3306 | ONLINE | SECONDARY | 8.0.25 | | group_replication_applier | 6d33eb83-da80-11eb-91ed-0242ac120004 | mgr3 | 3306 | ONLINE | SECONDARY | 8.0.25 | | group_replication_applier | 7b1e33b1-da7f-11eb-8157-0242ac120002 | mgr1 | 3306 | ONLINE | PRIMARY | 8.0.25 | +---------------------------+--------------------------------------+-------------+-------------+--------------+-------------+----------------+ 在这个阶段,MGR服务无法启动常见原因有:

  • 没有在 /etc/hosts中正确设置各节点的 hostname,会提示无法连接远程主机。
  • 利用docker创建的子网超过了RFC 1918定义的保留私有网络地址范围(A 类:10.0.0.0~10.255.255.255,B 类:172.16.0.0~172.31.255.255,C 类:192.168.0.0~192.168.255.255)。
  • 除去在选择作为PRIMARY节点上设置 group_replication_bootstrap_group=ON 外,其他节点上也设置了,会造成启动一个新的PRIMARY节点。
  • 各节点创建MGR账号后,会产生BINLOG,因此要执行 SET SQL_LOG_BIN=0 或者创建账号后再执行 RESET MASTER,否则会提示本地节点比远程节点的事务数更多,无法加入集群。
上述几种场景我都遇到过,可能还有其他更多情况,欢迎补充。

3.5 写入测试数据

这就构建完毕了,可以尝试在 PRIMARY节点 中创建库表并写入测试数据:

#提醒:从这里开始要重新启动binlog记录 [root@GreatSQL][(none)]> SET SQL_LOG_BIN=1; [root@GreatSQL][(none)]> create database mymgr; [root@GreatSQL][(none)]> use mymgr; [root@GreatSQL][(mymgr)]> create table t1(id int primary key); [root@GreatSQL][(mymgr)]> insert into t1 select rand()*10240; [root@GreatSQL][mymgr]>select * from t1; +------+ | id | +------+ | 3786 | +------+

4、利用Docker-compose创建Docker容器

如果觉得手工管理麻烦,也可以选用 docker-compose ,它可以更方便的管理docker容器。

先用yum安装docker-compose,并确认版本号

[root@greatsql]# yum install -y docker-compose [root@greatsql]# docker-compose --version docker-compose version 1.18.0, build 8dd22a9 编辑docker-compose的配置文件,其实就是把创建docker容器的命令行参数固化到配置文件而已:

[root@greatsql]# mkdir -p /data/docker-compose [root@greatsql]# vi /data/docker-compose/compose-mgr.yml version: '3' services: mgr1: image: greatsql/greatsql container_name: mgr1 hostname: mgr1 network_mode: bridge restart: unless-stopped environment: TZ: Asia/Shanghai MYSQL_ALLOW_EMPTY_PASSWORD: 1 MYSQL_INIT_MGR: 1 MYSQL_MGR_LOCAL: '172.17.0.2:33061' MYSQL_MGR_SEEDS: '172.17.0.2:33061,172.17.0.3:33061,172.17.0.4:33061' extra_hosts: - "mgr1:172.17.0.2" - "mgr2:172.17.0.3" - "mgr3:172.17.0.4" mgr2: image: greatsql/greatsql container_name: mgr2 hostname: mgr2 network_mode: bridge restart: unless-stopped depends_on: - "mgr1" environment: TZ: Asia/Shanghai MYSQL_ALLOW_EMPTY_PASSWORD: 1 MYSQL_INIT_MGR: 1 MYSQL_MGR_LOCAL: '172.17.0.3:33061' MYSQL_MGR_SEEDS: '172.17.0.2:33061,172.17.0.3:33061,172.17.0.4:33061' extra_hosts: - "mgr1:172.17.0.2" - "mgr2:172.17.0.3" - "mgr3:172.17.0.4" mgr3: image: greatsql/greatsql container_name: mgr3 hostname: mgr3 network_mode: bridge restart: unless-stopped depends_on: - "mgr2" environment: TZ: Asia/Shanghai MYSQL_ALLOW_EMPTY_PASSWORD: 1 MYSQL_INIT_MGR: 1 MYSQL_MGR_LOCAL: '172.17.0.4:33061' MYSQL_MGR_SEEDS: '172.17.0.2:33061,172.17.0.3:33061,172.17.0.4:33061' extra_hosts: - "mgr1:172.17.0.2" - "mgr2:172.17.0.3" - "mgr3:172.17.0.4" 启动三个实例:

[root@greatsql]# docker-compose -f /data/docker-compose/compose-mgr.yml up -d Name Command State Ports Creating mgr1 ... done Creating mgr2 ... done Creating mgr3 ... done Creating mgr2 ... Creating mgr3 ... 查看运行状态:

[root@greatsql]# docker-compose -f /data/docker-compose/compose-mgr.yml up -d Name Command State Ports ---------------------------------------------------------------------------- mgr1 /docker-entrypoint.sh mysqld Up 3306/tcp, 33060/tcp, 33061/tcp mgr2 /docker-entrypoint.sh mysqld Up 3306/tcp, 33060/tcp, 33061/tcp mgr3 /docker-entrypoint.sh mysqld Up 3306/tcp, 33060/tcp, 33061/tcp 进入被选为PRIMARY节点的容器mgr1,启动MGR服务:

[root@greatsql]# docker exec -it mgr1 bash [root@mgr1 /]# mysql ... [root@GreatSQL][(none)]> set global group_replication_bootstrap_group=ON; [root@GreatSQL][(none)]> start group_replication; 进入其他SECONDARY节点的容器,直接启动MGR服务:

[root@greatsql]# docker exec -it mgr2 bash [root@mgr2 /]# mysql ... [root@GreatSQL][(none)]> start group_replication; Query OK, 0 rows affected (2.76 sec) #查看MGR服务状态 [root@GreatSQL][(none)]>select * from performance_schema.replication_group_members; +---------------------------+--------------------------------------+-------------+-------------+--------------+-------------+----------------+ | CHANNEL_NAME | MEMBER_ID | MEMBER_HOST | MEMBER_PORT | MEMBER_STATE | MEMBER_ROLE | MEMBER_VERSION | +---------------------------+--------------------------------------+-------------+-------------+--------------+-------------+----------------+ | group_replication_applier | f0bd73d4-dbcb-11eb-99ba-0242ac110002 | mgr1 | 3306 | ONLINE | PRIMARY | 8.0.25 | | group_replication_applier | f1010499-dbcb-11eb-9194-0242ac110003 | mgr2 | 3306 | ONLINE | SECONDARY | 8.0.25 | +---------------------------+--------------------------------------+-------------+-------------+--------------+-------------+----------------+ 照旧,继续启动mgr3节点,一个三节点的MGR集群就完成了。

GreatSQL-Docker相关文档已经发布到 https://gitee.com/GreatSQL/GreatSQL-Docker,欢迎关注。

此外,GreatSQL Docker镜像文件也已发布到 https://hub.docker.com/r/greatsql/greatsql 欢迎下载体验。

5. 小结

本文介绍了如何在Docker下运行GreatSQL,以及构建MGR集群的方法,并且也介绍了利用docker-compose快速构建MGR集群的方法。现在生产环境中利用容器乃至在K8S环境中运行MySQL的场景越来越多了,有兴趣的同学也可以自行构建Docker镜像包。

参考资料、文档

免责声明

因个人水平有限,专栏中难免存在错漏之处,请勿直接复制文档中的命令、方法直接应用于线上生产环境。请读者们务必先充分理解并在测试环境验证通过后方可正式实施,避免造成生产环境的破坏或损害。

Enjoy GreatSQL :)

文章推荐:

GreatSQL季报(2021.12.26)

https://mp.weixin.qq.com/s/FZ_zSBHflwloHtZ38YJxbA

技术分享|sysbench 压测工具用法浅析

https://mp.weixin.qq.com/s/m16LwXWy9bFt0i99HjbRsw

故障分析 | linux 磁盘io利用率高,分析的正确姿势

https://mp.weixin.qq.com/s/7cu_36jfsjZp1EkVexkojw

技术分享|闪回在MySQL中的实现和改进

https://mp.weixin.qq.com/s/6jepwEE0DnYUpjMYO17VtQ

万答#20,索引下推如何进行数据过滤

https://mp.weixin.qq.com/s/pt6mr3Ge1ya2aa6WlrpIvQ

关于 GreatSQL

GreatSQL是由万里数据库维护的MySQL分支,专注于提升MGR可靠性及性能,支持InnoDB并行查询特性,是适用于金融级应用的MySQL分支版本。

Gitee:

https://gitee.com/GreatSQL/GreatSQL

GitHub:

https://github.com/GreatSQL/GreatSQL

Bilibili:

https://space.bilibili.com/1363850082/video

微信&QQ群:

可搜索添加GreatSQL社区助手微信好友,发送验证信息“加群”加入GreatSQL/MGR交流微信群

QQ群:533341697

微信小助手:wanlidbc

有关9. 利用Docker快速构建MGR | 深入浅出MGR的更多相关文章

  1. ruby - 在 Ruby 中构建长字符串的简洁方法 - 2

    在编写Ruby(客户端脚本)时,我看到了三种构建更长字符串的方法,包括行尾,所有这些对我来说“闻起来”有点难看。有没有更干净、更好的方法?变量递增。ifrender_quote?quote="NowthatthereistheTec-9,acrappyspraygunfromSouthMiami."quote+="ThisgunisadvertisedasthemostpopularguninAmericancrime.Doyoubelievethatshit?"quote+="Itactuallysaysthatinthelittlebookthatcomeswithit:themo

  2. Get https://registry-1.docker.io/v2/: net/http: request canceled while waiting - 2

    1.错误信息:Errorresponsefromdaemon:Gethttps://registry-1.docker.io/v2/:net/http:requestcanceledwhilewaitingforconnection(Client.Timeoutexceededwhileawaitingheaders)或者:Errorresponsefromdaemon:Gethttps://registry-1.docker.io/v2/:net/http:TLShandshaketimeout2.报错原因:docker使用的镜像网址默认为国外,下载容易超时,需要修改成国内镜像地址(首先阿里

  3. ruby - 使用 rbenv 和 ruby​​-build 构建 ruby​​ 失败,出现 undefined symbol : SSLv2_method - 2

    我正在尝试在配备ARMv7处理器的SynologyDS215j上安装ruby​​2.2.4或2.3.0。我用了optware-ng安装gcc、make、openssl、openssl-dev和zlib。我根据README中的说明安装了rbenv(版本1.0.0-19-g29b4da7)和ruby​​-build插件。.这些是随optware-ng安装的软件包及其版本binutils-2.25.1-1gcc-5.3.0-6gconv-modules-2.21-3glibc-opt-2.21-4libc-dev-2.21-1libgmp-6.0.0a-1libmpc-1.0.2-1libm

  4. ruby-on-rails - 如何构建复杂的 Rails 系统 - 2

    关闭。这个问题需要更多focused.它目前不接受答案。想改进这个问题吗?更新问题,使其只关注一个问题editingthispost.关闭8年前。Improvethisquestion我们有以下(以及更多)系统,我们将数据从一个应用推送/拉取到另一个:托管CRM(InsideSales.com)Asterisk电话系统(内部)横幅广告系统(openx,我们托管)潜在客户生成系统(自行开发)电子商务商店(spree,我们托管)工作板(本土)一些工作网站抓取+入站工作提要电子邮件传送系统(如Mailchimp,自主开发)事件管理系统(如eventbrite,自主开发)仪表板系统(大量图表和

  5. ruby - 如何以表格格式快速打印 Ruby 哈希值? - 2

    有没有办法快速将表格格式的ruby​​哈希打印到文件中?如:keyAkeyBkeyC...1232343451253474456...其中散列的值是不同大小的数组。还是使用双循环是唯一的方法?谢谢 最佳答案 试试我写的这个gem(在表中打印散列、ruby对象、ActiveRecord对象):http://github.com/arches/table_print 关于ruby-如何以表格格式快速打印Ruby哈希值?,我们在StackOverflow上找到一个类似的问题:

  6. ruby-on-rails -/usr/local/lib/libz.1.dylib,文件是为 i386 构建的,它不是被链接的体系结构 (x86_64) - 2

    在我的mac上安装几个东西时遇到这个问题,我认为这个问题来自将我的豹子升级到雪豹。我认为这个问题也与macports有关。/usr/local/lib/libz.1.dylib,filewasbuiltfori386whichisnotthearchitecturebeinglinked(x86_64)有什么想法吗?更新更具体地说,这发生在安装nokogirigem时日志看起来像:xslt_stylesheet.c:127:warning:passingargument1of‘Nokogiri_wrap_xml_document’withdifferentwidthduetoproto

  7. 电脑启动后显示器黑屏怎么办?排查下面4个问题,快速解决 - 2

    电脑启动出现显示器黑屏是一个相当常见的问题。如果您遇到了这个问题,不要惊慌,因为它有很多可能的原因,可以采取一些简单的措施来解决它。在本文中,小编将介绍下面4种常见的电脑启动后显示器黑屏的原因,排查这些原因,快速解决! 演示机型:联想Ideapad700-15ISK-ISE系统版本:Windows10一、显示器问题如果出现电脑启动后显示器黑屏的情况。那么首先您需要检查一下显示器是否正常工作。您可以通过更换另一个显示器或将当前显示器连接到另一台计算机来检查显示器是否存在问题。如果问题仍然存在,那么您可以排除显示器故障的可能性。 二、显卡问题如果您的电脑配备了独立显卡,那么显卡故障也可能是导致电脑

  8. ruby - Ruby 语言可以用来构建操作系统吗? - 2

    Ruby语言是否可以用于创建全新的移动操作系统或桌面操作系统,即是否可以用于系统编程? 最佳答案 嗯,现在有一些操作系统使用比C更高级的语言。基本上,ruby解释器本身需要用一些低级的东西来编写,并且需要一些引导加载代码将功能齐全的ruby​​解释器作为独立内核加载到内存中。一旦ruby​​解释器被引导并以内核模式(或innerrings之一)运行,就没有什么可以阻止您在其上构建整个操作系统。不幸的是,它可能会很慢。每个操作系统功能的垃圾收集可能会相当引人注目。ruby解释器将负责任务调度和网络堆栈等基本事情,使用垃圾收集框架会大大

  9. ruby-on-rails - 无法构建 gem native 扩展 (mkmf (LoadError)) - Ubuntu 12.04 - 2

    这个问题在这里已经有了答案:Unabletoinstallgem-Failedtobuildgemnativeextension-cannotloadsuchfile--mkmf(LoadError)(17个答案)关闭9年前。嘿,我正在尝试在一台新的ubuntu机器上安装rails。我安装了ruby​​和rvm,但出现“无法构建gemnative扩展”错误。这是什么意思?$sudogeminstallrails-v3.2.9(没有sudo表示我没有权限)然后它会输出很多“获取”命令,最终会出现这个错误:Buildingnativeextensions.Thiscouldtakeawhi

  10. ruby-on-rails - 私有(private) gem 没有安装在 docker 中 - 2

    我正在尝试使用docker运行一个Rails应用程序。通过github的sshurl安装的gem很少,如下所示:Gemfilegem'swagger-docs',:git=>'git@github.com:xyz/swagger-docs.git',:branch=>'my_branch'我在docker中添加了keys,它能够克隆所需的repo并从git安装gem。DockerfileRUNmkdir-p/root/.sshCOPY./id_rsa/root/.ssh/id_rsaRUNchmod700/root/.ssh/id_rsaRUNssh-keygen-f/root/.ss

随机推荐