diff --git a/src/box/relay.cc b/src/box/relay.cc
index 41f949e8eaf1b19f6c586f8b9895f2075faa73a2..41d3670ffd7d8d169ac448e6d0dfe4ce8857c027 100644
--- a/src/box/relay.cc
+++ b/src/box/relay.cc
@@ -31,6 +31,7 @@
 #include "relay.h"
 
 #include "trivia/config.h"
+#include "trivia/util.h" /** static_assert */
 #include "tt_static.h"
 #include "scoped_guard.h"
 #include "cbus.h"
@@ -55,6 +56,8 @@
 #include "txn_limbo.h"
 #include "raft.h"
 
+#include <stdlib.h>
+
 /**
  * Cbus message to send status updates from relay to tx thread.
  */
@@ -201,13 +204,21 @@ relay_new(struct replica *replica)
 	 * (Use clang UB Sanitizer, to make sure of this)
 	 */
 	assert((sizeof(struct relay) % alignof(struct relay)) == 0);
-	struct relay *relay = (struct relay *)
-		aligned_alloc(alignof(struct relay), sizeof(struct relay));
-	if (relay == NULL) {
+	/*
+	 * According to posix_memalign requirements, align must be
+	 * multiple of sizeof(void *).
+	 */
+	static_assert(alignof(struct relay) % sizeof(void *) == 0,
+		      "align for posix_memalign function must be "
+		      "multiple of sizeof(void *)");
+	struct relay *relay = NULL;
+	if (posix_memalign((void **)&relay, alignof(struct relay),
+			   sizeof(struct relay)) != 0) {
 		diag_set(OutOfMemory, sizeof(struct relay), "aligned_alloc",
 			  "struct relay");
 		return NULL;
 	}
+	assert(relay != NULL);
 
 	memset(relay, 0, sizeof(struct relay));
 	relay->replica = replica;