If any of you are like me, you’ve read all of the Habitat marketing and have bought into this idea of decoupling your app from your Operating System. It’s a great goal and a lofty claim.
So I set out to test it.
Using Terraform, I built out a three node postgresql cluster on Ubuntu 16.04. The key here was I created a separate datastore, and mounted it under /hab
, so I have my OS and everything underneath /hab
is effectively isolated.
Next I built a CentOS 7.2 VM. Note that they have different Kernels:
root@hab-psql-tf-stable-1:~# uname -a
Linux hab-psql-tf-stable-1 4.4.0-92-generic #115-Ubuntu SMP Thu Aug 10 09:04:33 UTC 2017 x86_64 x86_64 x86_64 GNU/Linux
root@hab-psql-tf-stable-1:~# cat /etc/*release*
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=16.04
[root@hab-psql1-pt2 ~]# uname -a
Linux hab-psq1-pt2 3.10.0-327.el7.x86_64 #1 SMP Thu Nov 19 22:10:57 UTC 2015 x86_64 x86_64 x86_64 GNU/Linux
[root@hab-psql1-pt2 ~]# cat /etc/*release*
CentOS Linux release 7.2.1511 (Core)
Derived from Red Hat Enterprise Linux 7.2 (Source)
I chose ubuntu 16.04 and CentOS 7.2 for no particular reason other than it’s what I clicked on in OpenStack.
So I unmounted then mounted my volume on my new CentOS 72 image, created my systemd init script aaaand:
Mar 8 17:45:21 hab-psql1-pt2 systemd: Starting Habitat Supervisor...
Mar 8 17:45:21 hab-psql1-pt2 systemd: Failed at step EXEC spawning /bin/hab: No such file or directory
Doh. Oh, link /bin/hab
to /hab/pkgs/core/hab/0.77.0/20190301212334/bin/hab
, problem solved, right?
Well… sort of:
hab-sup(MR): Can't create directory /hab/svc/postgresql: hab-sup(ER)[components/sup/src/error.rs:460:46]: Package requires user hab to exist, but it doesn't
hab-sup(MR): If this service is running as non-root, you'll need to create /hab/svc/postgresql and give the current user write access to it
Ok, easy fix, create the hab user and group, start my service again, and
[root@hab-psq1-pt2 ~]# hab svc status
package type desired state elapsed (s) pid group
core/postgresql/9.6.11/20190305213451 standalone up up 3 3012 postgresql.default
And, we can confirm on our master node:
Before the change
postgres=# SELECT client_addr, state FROM pg_stat_replication;
client_addr | state
--------------+-----------
172.16.10.11 | streaming
172.16.10.37 | streaming
During the change:
postgres=# SELECT client_addr, state FROM pg_stat_replication;
client_addr | state
--------------+-----------
172.16.10.37 | streaming
After the change:
postgres=# SELECT client_addr, state FROM pg_stat_replication;
client_addr | state
--------------+-----------
172.16.10.37 | streaming
172.16.10.18 | streaming
Once I mounted my /hab
partition, created my systemd init script, linked /bin/hab
to the right location, and created my hab
user, I was off and cooking with gas having successfully changed out the OS underneath the application.